Flask-SocketIO eventlet 无法切换到不同的线程
Flask-SocketIO eventlet cannot switch to a different thread
我目前正在从事的项目使用 Flask-SocketIO 在我的 Raspberry Pi 和连接到它所服务的网站的客户端之间进行通信。但是,一旦我设置了一个或多个额外的线程,就会发生错误。我使用了一个猴子补丁来允许后台线程(这有效)。但是当我启动另一个程序来处理特定事件时,程序崩溃了。这些是当前的核心文件:
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 的情况下工作,那么现在你最好的选择是:
- 异步模式=线程
- PiCamera 在单独的进程中并通过套接字进行通信
我目前正在从事的项目使用 Flask-SocketIO 在我的 Raspberry Pi 和连接到它所服务的网站的客户端之间进行通信。但是,一旦我设置了一个或多个额外的线程,就会发生错误。我使用了一个猴子补丁来允许后台线程(这有效)。但是当我启动另一个程序来处理特定事件时,程序崩溃了。这些是当前的核心文件:
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 的情况下工作,那么现在你最好的选择是:
- 异步模式=线程
- PiCamera 在单独的进程中并通过套接字进行通信