Multithreading Can';t使用websockify在线程之间共享变量
在过去的几天里,我一直在努力使它发挥作用。没有明显的文档,所以我最终做了一些尝试&错误的事情 我有一个运行在两个线程上的服务器。一个线程始终发送和接收信息,而第二个线程执行其他工作。然而,我似乎无法让这两个线程相互对话Multithreading Can';t使用websockify在线程之间共享变量,multithreading,python-3.x,websocket,shared-memory,Multithreading,Python 3.x,Websocket,Shared Memory,在过去的几天里,我一直在努力使它发挥作用。没有明显的文档,所以我最终做了一些尝试&错误的事情 我有一个运行在两个线程上的服务器。一个线程始终发送和接收信息,而第二个线程执行其他工作。然而,我似乎无法让这两个线程相互对话 #!/usr/bin/env python from websocket import WebSocketServer from threading import Thread from time import sleep class Server(WebSocketServ
#!/usr/bin/env python
from websocket import WebSocketServer
from threading import Thread
from time import sleep
class Server(WebSocketServer):
a=10
def new_client(self):
while True:
sleep(1)
print("Thread 2: ", self.a)
server = Server('', 9017)
Thread(target=server.start_server).start()
# Main thread continues
while 1:
sleep(1)
server.a+=2
print("Main thread: ", server.a)
输出:
Main thread: 18
Thread 2: 16
Main thread: 20
Thread 2: 16
Main thread: 22
Thread 2: 16
Main thread: 24
Thread 2: 16
显然,这两个线程不共享相同的属性
a
。为什么?默认情况下,websockify会为每个新的客户端连接生成一个新进程(websockify连接往往是长期的,因此进程创建开销通常不是问题)。这提供了一些安全隔离,以降低websockify中的漏洞被利用以允许一个客户端监听或以其他方式影响其他客户端连接的风险
您可以在top_new_client方法中找到流程创建代码。有一个名为--run once的选项,它将在同一个进程中处理单个客户机的请求。但是,它被设计为在单次连接后退出top_new_客户端中的主循环。您可以删除self.run_once条件检查中的break语句,但这意味着您一次无法连接多个客户端,但这对于您尝试执行的操作可能已经足够了
我还有一些未推送的进行中代码,用于将WebSocketServer转换为更像HTTPServer类的WebSocketServer,您可以在其中提供自己的线程或多处理混入。如果你认为这可能有帮助,让我知道,我可以把它推到分支机构
您案例中的另一个选项是使用某种形式的IPC通信在每个客户端进程和父进程之间进行通信。默认情况下,websockify会为每个新客户端连接生成一个新进程(websockify连接往往是长期的,因此进程创建开销通常不是问题)。这提供了一些安全隔离,以降低websockify中的漏洞被利用以允许一个客户端监听或以其他方式影响其他客户端连接的风险 您可以在top_new_client方法中找到流程创建代码。有一个名为--run once的选项,它将在同一个进程中处理单个客户机的请求。但是,它被设计为在单次连接后退出top_new_客户端中的主循环。您可以删除self.run_once条件检查中的break语句,但这意味着您一次无法连接多个客户端,但这对于您尝试执行的操作可能已经足够了 我还有一些未推送的进行中代码,用于将WebSocketServer转换为更像HTTPServer类的WebSocketServer,您可以在其中提供自己的线程或多处理混入。如果你认为这可能有帮助,让我知道,我可以把它推到分支机构
对于您的案例,另一种选择是使用某种形式的IPC通信在每个客户端进程和父进程之间进行通信。谢谢!只需将
run\u once=False
更改为run\u once=True
即可解决所有问题:)更新:您还必须对kanaka所述的break
语句进行注释,否则一旦断开连接,客户端将无法重新连接。谢谢!只需将run\u once=False
更改为run\u once=True
即可解决所有问题:)更新:您还必须对kanaka所述的break
语句进行注释,否则一旦断开连接,客户端将无法重新连接。