私が現在取り組んでいるプロジェクトは、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"
にフォールバックする必要がありますか?
てみ猿を介して通信する:それはPiCameraせずに動作する場合は、今すぐあなたの最良の選択肢のいずれかであります、とりわけあなたの輸入品。 – Miguel
私はそれを試みましたが、うまくいきませんでした。他のスレッド自体を生成する '他のモジュール'との関係があると思います(PiCameraが 'run'メソッド中に連続的にキャプチャするため)。新しいスレッドを設定するいくつかのイベントがありますが、これらはうまく動作します。 – Y4sper
私はあなたがアプリケーション全体で猿のパッチが動作していることを確認するべきだと思います。私の理解は、このエラーは、通常と緑のスレッドを混在させるときに発生しているということです。 – Miguel