2016-04-03 3 views
1

私が現在取り組んでいるプロジェクトは、Flask-SocketIOを使って自分のラズベリーパイとそれが提供するウェブサイトに接続しているクライアントとの間で通信します。ただし、1つ以上の余分なスレッドを設定するとエラーが発生します。私はバックグラウンドスレッドを許可するためにサルのパッチを使用しました(これは動作します)。しかし、特定のイベントを処理する別のイベントを起動すると、プログラムがクラッシュします。これらは現在、コアファイルです:Flask-SocketIOイベントレットは別のスレッドに切り替えることはできません

apps.py

import eventlet 
eventlet.monkey_patch() 

from flask import Flask 
from flask_socketio import SocketIO 

app = Flask(__name__) 
sio = SocketIO(app, async_mode="eventlet") 

main.py

import apps 
import other_module 
import another_module  

from threading import Thread 

from flask_socketio import emit 

@apps.sio.on("problematic") 
def this_is_problematic(data): 
    Thread(target=other_module.run).start() 

def updates(): 
    while True: 
     apps.sio.emit("data", another_module.data()) 
     time.sleep(.3) 

if __name__ == "__main__": 
    Thread(target=updates).start() 
    apps.sio.run(apps.app, host="0.0.0.0") 

other_moduleはしばしば、数分のために実行可能性がある(そのrunメソッドの実行中にすべてのクライアントにイベントを発行しますしかし頻繁に眠る)、私はそれがそれと関係があると思います。 appsモジュールは、そうでなければ循環的な依存関係を避けるために別個に定義されています。これはother_moduleは、そのrunメソッドを実行している間、私は取得エラーですより多くの何もないとあまり何も:

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/eventlet/hubs/hub.py", line 457, in fire_timers 
    File "/usr/local/lib/python2.7/dist-packages/eventlet/hubs/timer.py", line 58, in __call__ 
    cb(*args, **kw) 
    File "/usr/local/lib/python2.7/dist-packages/eventlet/semaphore.py", line 145, in _do_acquire 
    waiter.switch() 
error: cannot switch to a different thread 

編集:私は別のスレッドで私のPiCameraを使用しようとするたびにエラーが発生したように見えます。私はすでにeventlet.import_patched("picamera")を使って安全にインポートしようとしましたが、成功しませんでした。 async_mode="threading"にフォールバックする必要がありますか?

+0

てみ猿を介して通信する:それはPiCameraせずに動作する場合は、今すぐあなたの最良の選択肢のいずれかであります、とりわけあなたの輸入品。 – Miguel

+0

私はそれを試みましたが、うまくいきませんでした。他のスレッド自体を生成する '他のモジュール'との関係があると思います(PiCameraが 'run'メソッド中に連続的にキャプチャするため)。新しいスレッドを設定するいくつかのイベントがありますが、これらはうまく動作します。 – Y4sper

+0

私はあなたがアプリケーション全体で猿のパッチが動作していることを確認するべきだと思います。私の理解は、このエラーは、通常と緑のスレッドを混在させるときに発生しているということです。 – Miguel

答えて

0

問題を切り分けます。別のプロセスで

  • PiCameraスレッディング=

    • 非同期モードとメインファイルにeventletにパッチを当てるソケット
  • +0

    私はそれを試してみるでしょうが、パフォーマンスの可能性は複雑さを上回らないと思います。私は 'async-mode =" threading "に戻り、簡単な方法で対処できます。 – Y4sper

    +0

    スレッディングはパフォーマンスです。別のプロセスが問題の回避策です。 – temoto

    +0

    私は 'eventlet'を使い続けることができるというパフォーマンスの向上を意味しましたが、' async-mode = "threading"に落ち着くように思えます。 – Y4sper

    関連する問題