在我发现的Flask / Socket.io的几乎每个例子中,Socket.io触发一个事件,然后由Flask应用程序处理,并处理任何响应。
我需要不断地将新数据推送到页面,而不需要事件触发器。在Flask / Socket.io online tutorial中,他们简要地提到了这一点,但我有点卡住了。
截至目前,我只是在客户端连接上推送数据,为每个连接创建一个新线程。这是我的代码:
@socketio.on('connect', namespace='/test')
def test_connect():
# need visibility of the global thread objects
print "We're working"
global thread
print('Client connected')
if not thread.isAlive():
print "Starting Thread"
thread = RandomThread()
thread.start()
然后:
class RandomThread(Thread):
def __init__(self):
self.delay = 6
super(RandomThread, self).__init__()
## Find Tweets every X amount of seconds
def tweetFinder(self):
print "Finding Tweets..."
while not thread_stop_event.isSet():
twit = Twitter()
twit.login()
cityName = twit.getUserTweets()
print cityName
socketio.emit('newnumber', {'number': cityName}, namespace='/test')
sleep(self.delay)
def run(self):
self.tweetFinder()
但是,如何在应用程序启动时立即启动推送数据的线程/进程?我只是希望它在后端中作为一项持续的,无限的任务工作,无论事件如何都会更新页面。
以下是Flask / Socket-io文档所说的内容,我无法弄清楚如何使其按照我想要的方式工作。
在此之前显示的所有示例中,服务器都会响应客户端发送的事件。但对于某些应用程序,服务器需要是消息的发起者。这对于向客户端发送通知在服务器中发起的事件(例如在后台线程中)非常有用。 socketio.send()和socketio.emit()方法可用于向所有连接的客户端广播:
def some_function():
socketio.emit('some event', {'data': 42})
请注意,在此用法中没有客户端上下文,因此假定为broadcast = True,并且不需要指定。