gpt4 book ai didi

python - Python Tornado中的已连接客户端列表

转载 作者:行者123 更新时间:2023-12-03 13:04:57 28 4
gpt4 key购买 nike

我有一个由线程启动的独立进程中运行的Tornado WebSocket服务器。当该线程获取通过websocket发送的消息时,它将调用TornadoServer的publish方法。

我发现在一个单独的进程上运行 Tornado 是我启动 Tornado 循环而在此调用中没有线程阻塞的唯一方法。

在我的线程中,我通过在线程 init 方法上调用以下方法来启动 Tornado 过程:

self.p = tornado_server.TornadoServer()
self.p.daemon = True
self.p.start()

在此线程中,我有一个无限循环,尝试从Queue中获取消息,如果获取消息,它将调用 self.p.publish(client, message)

到目前为止,一切都很好。

在 Tornado 过程中,我基本上实现了发布/订阅系统。例如,当用户打开网页时,页面会为特定的“客户端”发送“订阅”消息。在“on_message”回调中,我附加了WebSocketHandler实例和用户想要订阅全局列表的客户端的元组。

然后,发布方法应在列表中搜索消息目标客户端的订阅用户,并且应在该列表上存储的WebSocket上调用write_message。

唯一不起作用的是我的“客户”列表具有不同的范围或其他内容。

这是我的tornado_server文件的代码:
#!/usr/bin/python2
import tornado.web, tornado.websocket, tornado.ioloop, multiprocessing

clients = []

class TornadoServer(multiprocessing.Process):

class WebSocketHandler(tornado.websocket.WebSocketHandler):
def on_message(self, message):
global clients
print 'TORNADO - Received message:', str(message)
channel, subtopic = message.split('/')
print 'TORNADO - Subscribing:', str(subtopic)
clients.append((self, subtopic))

def on_close(self):
global clients
for websocket, client in clients:
if self == websocket:
print 'TORNADO - Removed client'
to_remove = (self, client)
clients.remove(to_remove)

def __init__(self):
multiprocessing.Process.__init__(self)
self.application = tornado.web.Application([(r"/tri-anim", WebSocketHandler)])
self.application.listen(1339)

def run(self):
tornado.ioloop.IOLoop.current().start()

def publish(self, client, message):
global clients
for websocket, websocketclient in clients:
if websocketclient == client:
websocket.write_message(str(message))

不管我做什么,客户总是有不同的范围。调用publish时,“客户端”始终为空。有什么办法可以使它正常工作吗?

最佳答案

您在父进程中调用发布,但是客户端列表仅在子进程中更新。使用多重处理时,每个进程都会获得自己的所有变量副本。如果您使用线程来代替,变量将被共享,但是即使那样,您仍需要使用IOLoop.instance()。add_callback在调用publish的线程和write_message函数之间进行线程安全的切换(必须在线程上调用IOLoop线程)。

关于python - Python Tornado中的已连接客户端列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20354601/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com