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