Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python线程和SocketIo.start\u background\u任务线程之间共享数据?_Python_Multithreading_Flask_Flask Socketio - Fatal编程技术网

如何在python线程和SocketIo.start\u background\u任务线程之间共享数据?

如何在python线程和SocketIo.start\u background\u任务线程之间共享数据?,python,multithreading,flask,flask-socketio,Python,Multithreading,Flask,Flask Socketio,目标: run(app)启动服务器并使用while循环无限地向多个Javascript(客户端)发送数据 数据来自另一个while循环,但是一旦脚本运行(独立于客户端连接)以供其他使用,循环就需要启动 当前: 对于第一点,我已经有了以下代码: def background_thread(): while True: socketio.emit('response',{'data': value},namespace='/test') @socketio.on('conn

目标:

  • run(app)启动服务器并使用while循环无限地向多个Javascript(客户端)发送数据

  • 数据来自另一个while循环,但是一旦脚本运行(独立于客户端连接)以供其他使用,循环就需要启动

  • 当前:

  • 对于第一点,我已经有了以下代码:

    def background_thread():
        while True:
            socketio.emit('response',{'data': value},namespace='/test')
    
    @socketio.on('connect', namespace='/test')
    def test_connect():
        global thread
        with thread_lock:
            if thread is None:
                thread = socketio.start_background_task(target=background_thread)
        emit('response', {'data': 'Connected'})
    
    if __name__ == '__main__':
        socketio.run(app, debug=True, host='localhost', port=args.portNum)
    
  • 从上面开始,我只在客户端连接到服务器后添加一个线程。我不知道如何从这一点上达到第2点?我正在考虑使用另一个线程,但是在组织代码时遇到了问题,因此当客户端连接到服务器时,
    socketio.start\u background\u task
    可以无限地与默认python线程共享数据

    另外一个问题:如何允许多个客户端连接到一台服务器


    谢谢大家

    我不确定我是否理解您的问题,但如果您要问的是如何独立于客户端连接启动线程,您可以在启动服务器之前立即启动它:

    if __name__ == '__main__':
        socketio.start_background_task(my_other_thread)
        socketio.run(app, debug=True, host='localhost', port=args.portNum)
    
    如果您需要同步这两个线程,例如,当
    my\u other\u thread
    有一个新值要发送时,
    background\u thread
    立即将其拾取并发送,那么您可以使用标准线程同步原语。在这种情况下,您可能需要一个
    事件
    实例。请参阅标准库中的Python线程文档


    关于如何允许多个客户端连接,您无需为此做任何事情。您现有的服务器将允许来自多个客户端的连接。

    非常感谢!当你说每当我的线程有新的值时,后台线程就会发送这些值,我仍然感到困惑。它们不是在同一个线程中,在socketio.start\u background\u任务(我的另一个线程)中吗??另一个问题是,假设我有多个后台任务,它们是否可以像普通python线程那样使用队列类彼此共享数据?是的,您可以使用
    队列来同步两个或多个线程。但是,如果您使用的是eventlet或gevent,那么您需要使用这些框架附带的Queue对象,而不是Python中的Queue对象。我想到一点,那就是,为什么我不能使用全局变量在线程之间共享数据而不是使用队列类?您可以使用全局变量在线程之间共享数据,这不是问题。问题是同步线程,如何使一个线程唤醒,并在另一个线程达到特定状态时执行某些操作。这不能用全局变量来完成。