如何在线程中运行 python-socketio?

Jan*_*ski 4 python multithreading flask socket.io

我在 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()
Run Code Online (Sandbox Code Playgroud)

有一个简单的例子,但它不起作用。在服务器日志中,我得到:

engineio:a16afb90de2e44ab8a836498086c88f6: Sending packet MESSAGE data 2["log","Game started!"]

但客户永远不会得到它!

Javascript:

socket.on('log', function(a) {
  console.log(a);
});
Run Code Online (Sandbox Code Playgroud)

Jan*_*ski 5

所以对我有用的是在 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在文档中查看更多信息。但是如果仍然存在问题,eventlet.sleep()在导入部分之前添加空monkey_patch就可以了。在讨论中在网络上的某个地方找到了它。