无法在使用websockify的线程之间共享变量

时间:2013-07-11 11:22:57

标签: multithreading python-3.x websocket shared-memory

在最后几天试图让它发挥作用时,我一直在与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。为什么呢?

1 个答案:

答案 0 :(得分:1)

默认情况下,websockify为每个新客户端连接生成一个新进程(websockify连接往往是长期存在的,因此进程创建开销通常不是问题)。这提供了一些安全隔离,以降低webockify中的错误可被利用以允许一个客户端监听或以其他方式影响其他客户端连接的风险。

您可以在top_new_client方法中找到流程创建代码。有一个名为--run-once的选项可以处理同一进程中的单个客户端。但是,它设计为在单个连接后退出top_new_client中的主循环。您可以在self.run_once条件检查中删除break语句,但这意味着您将无法一次连接多个客户端,但这可能足以满足您的要求。

我还有一些未经过处理的正在进行的代码,可以将WebSocketServer切换为更像HTTPServer类,您可以在其中提供自己的线程或多处理混合。如果您认为这可能有所帮助,请告诉我,我可以将其推到分支机构。

您的案例的另一个选择是使用某种形式的IPC通信在每个客户端进程和父进程之间进行通信。