如何在Thread中运行python-socketio?

时间:2017-05-05 09:53:53

标签: python multithreading flask socket.io

我在Flask中使用python-socketio并且想要启动ggplot(data = df, aes(x = Question, y = n)) + geom_bar(aes(fill = Agree.Disagree),stat = "identity") + theme_minimal() + ggtitle("Questions about values and attitudes") + labs(x = "",y = "n") + scale_fill_manual(values = c(wes_palette("GrandBudapest2"), wes_palette("Moonrise3"))) + geom_text(aes(label=Percent), vjust = 2, colour="white") + coord_flip() 实例并在信号到来时从它发出信号。在烧瓶应用程序中,我有:

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()

但客户永远不会得到它!

Javascript:

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

1 个答案:

答案 0 :(得分:4)

那么对我有用的是在Flask + python-socketio中切换到线程模式,如下所示: http://python-socketio.readthedocs.io/en/latest/#standard-threading-library

之前我使用的是eventlet,导致了这个问题。

另一种解决方案

使用eventlet是可能的,但是线程必须是非阻塞的,因此说,标准线程在这里没用。

要创建线程,必须使用socketio.Server方法start_background_task,它将函数作为参数。

同样在线程任务中,使用eventlet.sleep()代替time.sleep()方法。

但是,如果没有一些黑客并使用monkey_patcheventlet一起使用,则可能无效。 See more in documentation。但是如果仍然存在问题,请在eventlet.sleep()之前的导入部分添加空monkey_patch。在讨论中发现它在网络上的某个地方。