Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Flask SocketIO eventlet无法切换到其他线程_Python_Multithreading_Eventlet_Flask Socketio - Fatal编程技术网

Python Flask SocketIO eventlet无法切换到其他线程

Python Flask SocketIO eventlet无法切换到其他线程,python,multithreading,eventlet,flask-socketio,Python,Multithreading,Eventlet,Flask Socketio,我目前正在从事的项目使用Flask SocketIO在我的Raspberry Pi和连接到它所服务的网站的客户之间进行通信。但是,一旦我设置了一个或多个额外线程,就会发生错误。我使用了一个猴子补丁来允许一个背景线程(这是可行的)。但是当我启动另一个程序来处理特定事件时,程序崩溃了。以下是当前的核心文件: apps.py import eventlet eventlet.monkey_patch() from flask import Flask from flask_socketio impo

我目前正在从事的项目使用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")
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")
main.py

import eventlet
eventlet.monkey_patch()

from flask import Flask
from flask_socketio import SocketIO

app = Flask(__name__)
sio = SocketIO(app, async_mode="eventlet")
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_模块
在执行其
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\u patched(“picamera”)
安全地导入它,但没有成功。我是否应该退回到
async\u mode=“threading”

隔离问题。如果没有PiCamera也能正常工作,那么现在您最好的选择是:

  • 异步模式=线程
  • PiCamera在单独的进程中,通过套接字进行通信

在主文件中尝试monkey patching eventlet,首先是导入。我尝试了,但没有成功。我认为这可能与
其他模块
自身产生另一个线程有关(对于
PiCamera
在其
运行
方法期间连续捕获)。我有一些其他事件设置了一个新的线程,这些工作很好。我想你应该确保猴子补丁在整个应用程序中都能正常工作。我的理解是,在混合常规线程和绿色线程时会出现此错误。我尝试导入我与
eventlet.import\u patched
一起使用的每个外部库。但是,该错误仅在运行
PiCamera
时发生。我尝试将摄像头线程的设置从
run
方法移动到
main.py
模块,但还是没有成功。我会尝试一下,但我认为性能上的可能提高不会超过其增加的复杂性。我可以回到
async mode=“threading”
,用一种简单的方式处理它。线程就是性能。单独的进程是解决问题的一种方法。我的意思是能够继续使用
eventlet
,从而提高性能,但似乎回到
async mode=“threading”
最适合我。