使用socket.io从后台线程更新网页但没有事件触发器?

时间:2014-12-18 14:30:50

标签: python multithreading sockets flask socket.io

在我发现的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,并且不需要指定。

0 个答案:

没有答案