我在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!"]
答案 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_patch
与eventlet
一起使用,则可能无效。 See more in documentation。但是如果仍然存在问题,请在eventlet.sleep()
之前的导入部分添加空monkey_patch
。在讨论中发现它在网络上的某个地方。