1

在过去的几天里,我一直在与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。为什么?

4

1 回答 1

1

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

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

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

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

于 2013-07-11T15:39:35.330 回答