【问题标题】:How to run python-socketio in Thread?如何在线程中运行 python-socketio?
【发布时间】: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!"]

但客户永远不会得到它!

Javascript:

socket.on('log', function(a) {
  console.log(a);
});

【问题讨论】:

    标签: python multithreading flask socket.io


    【解决方案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 就可以了。在网上某处的讨论中找到它。

    【讨论】:

      猜你喜欢
      • 2020-02-07
      • 2021-10-24
      • 1970-01-01
      • 2022-07-02
      • 2018-07-28
      • 1970-01-01
      • 2022-11-26
      • 2018-08-12
      • 2019-11-13
      相关资源
      最近更新 更多