如何在线程中运行 python-socketio?
Posted
技术标签:
【中文标题】如何在线程中运行 python-socketio?【英文标题】:How to run python-socketio in Thread? 【发布时间】:2017-10-03 18:06:56 【问题描述】:我在 Flask 中使用了 python-socketio,并且想要启动 Thread
实例并在信号到来时从它发出信号。在烧瓶应用程序中,我有:
import threading
def game(my_sio):
my_sio.emit('log', data = "Game started!")
return
@sio.on('start')
def startGame(sid):
t = threading.Thread(target = game, args = [sio])
t.start()
有一个简单的例子,它不起作用。在服务器日志中我得到:
engineio:a16afb90de2e44ab8a836498086c88f6: Sending packet MESSAGE data 2["log","Game started!"]
但客户永远不会得到它!
socket.on('log', function(a)
console.log(a);
);
【问题讨论】:
【参考方案1】:所以对我有用的是在 Flask + python-socketio 中切换到线程模式,如下所述: https://python-socketio.readthedocs.io/en/latest/server.html#standard-threads
我之前使用的是eventlet
,这导致了问题。
另一种解决方案
使用 eventlet 是可能的,但线程必须是非阻塞的,因此说,标准线程在这里没用。
要创建线程,必须使用socketio.Server
方法start_background_task
,它将函数作为参数。
同样在线程任务内部,使用eventlet.sleep()
代替time.sleep()
方法。
但是,如果没有一些技巧和使用 monkey_patch
以及 eventlet
,可能无法运行的事件。 See more in documentation。但是如果仍然存在问题,在导入部分中添加空的eventlet.sleep()
monkey_patch
就可以了。在网上某处的讨论中找到它。
【讨论】:
以上是关于如何在线程中运行 python-socketio?的主要内容,如果未能解决你的问题,请参考以下文章
python-socketio 客户端无法获取公共数据,但 NodeJS socket.io-client 没有
让频道与 Python-socketio 中的房间一致,以及一般的 pubsub 问题