Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.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 如何在另一个无限循环线程中使用生产者正确管理websocket服务器_Python_Multithreading_Websocket_Thread Safety - Fatal编程技术网

Python 如何在另一个无限循环线程中使用生产者正确管理websocket服务器

Python 如何在另一个无限循环线程中使用生产者正确管理websocket服务器,python,multithreading,websocket,thread-safety,Python,Multithreading,Websocket,Thread Safety,我正在努力解决一个问题,这个问题应该是容易的,但却很难解决。 我想建立一个websocket服务器,向每个客户端广播消息。这些消息来自另一个API,它需要一个进行事件的无限循环。我决定将这个无限循环放在另一个线程中,但我很难管理线程之间的交互 我真的需要主线程能够控制生产者线程,例如更改客户端列表或customMessage dict。由于无限循环将在run()中运行,我需要确保一切都是线程安全的 这是我的密码。我将while循环中的API事件处理替换为创建随机消息以及基于客户端的自定义消息。我

我正在努力解决一个问题,这个问题应该是容易的,但却很难解决。 我想建立一个websocket服务器,向每个客户端广播消息。这些消息来自另一个API,它需要一个进行事件的无限循环。我决定将这个无限循环放在另一个线程中,但我很难管理线程之间的交互

我真的需要主线程能够控制生产者线程,例如更改客户端列表或customMessage dict。由于无限循环将在run()中运行,我需要确保一切都是线程安全的

这是我的密码。我将while循环中的API事件处理替换为创建随机消息以及基于客户端的自定义消息。我们等待1秒钟来模拟两个事件之间的时间

from SimpleWebSocketServer import SimpleWebSocketServer, WebSocket
from random import random
import time
import threading



class Producer(threading.Thread):

    def __init__(self):
        self.clients = []
        self.customMessage = {}
        self.lock = threading.RLock()
        self.session = self.connect()

        super(Producer, self).__init__()

    def run(self):
        while True:
            # ultimately this part will process received events from another api

            message = f"random_number : {random()}"
            for client in self.clients:
                # send random number to everybody
                client.sendMessage(message)

                # send a custom message
                if client in self.customMessage:
                    client.sendMessage(self.customMessage[client])
            time.sleep(1)

    def addCLient(self, client):
        with lock:
            self.clients.append(client)

    def removeCLient(self, client):
        with lock:
            self.clients.remove(client)

    def manageCustomMessage(self, client, message):
        with lock:
            self.customMessage[client] = message



class Consumer(WebSocket):

    def handleMessage(self):
        producer.manageCustomMessage(self, self.data)

    def handleConnected(self):
       print(self.address, 'connected')
       producer.addCLient(self)

    def handleClose(self):
       producer.removeCLient(self)
       print(self.address, 'closed')


producer = Producer()
producer.setDaemon(True)
producer.start()

server = SimpleWebSocketServer('127.0.0.1', 8080, Consumer)
server.serveforever()

我的问题是:像我这样使用锁好吗?在类线程中添加run以外的方法是否还可以

我希望避免队列,因为我将从Producer类中获得许多属性,这些属性必须从main类更改

提前谢谢