最近几天我一直在与Websockify进行斗争,试图让它发挥作用。没有明显的文件,所以我最终做的事情与试验&错误
我有一个在两个线程上运行的服务器。一个线程总是发送和接收信息,而第二个线程做其他工作。然而,我似乎无法让这两条线索相互交流。
#!/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
。为什么?
默认情况下,webstockify为每个新的客户端连接生成一个新的进程(webstockify连接往往是长寿命的,因此进程创建开销通常不是问题)。这提供了一些安全隔离,以降低webstockify中的漏洞被利用以允许一个客户端侦听或以其他方式影响其他客户端连接的风险。
您可以在top_new_client方法中找到流程创建代码。有一个名为--run once的选项,它将处理同一进程中的单个客户端。然而,它被设计为在单个连接之后退出top_new_client中的主循环。你可以在self.run_once条件检查中删除break语句,但这意味着你不能一次连接多个客户端,但这可能足以满足你的要求。
我还有一些未处理的正在进行中的代码,可以将WebSocketServer切换为更像HTTPServer类,在HTTPServer类中您可以提供自己的线程或多处理混合。如果你认为这可能有帮助,请告诉我,我可以把它推到分支机构。
对于您的案例,另一种选择是使用某种形式的IPC通信来在每个客户端进程和父进程之间进行通信。