2013-07-11 80 views
1

我一直在努力使其工作的最後幾天0​​。沒有明顯的文檔,所以我最終會試用&錯誤。無法與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

默認情況下,websockify會爲每個新的客戶端連接生成一個新進程(websockify連接往往是長期的,因此進程創建開銷通常不是問題)。這提供了一些安全隔離來降低websockify中的錯誤可以被利用來允許一個客戶端偵聽或以其他方式影響其他客戶端連接的風險。

您可以在top_new_client方法中找到進程創建代碼。有一個選項叫做--run-once,它可以在同一個進程中處理單個客戶端。但是,它旨在在單個連接後退出top_new_client中的主循環。您可以刪除self.run_once條件檢查中的break語句,但這意味着您無法一次連接多個客戶端,但也許這對於您嘗試執行的操作而言已足夠。

我也有一些unpushed正在進行的代碼來切換WebSocketServer更像HTTPServer類,您提供自己的線程或多處理mixin。如果你認爲這可能會有幫助,請告訴我,我可以將它推送到分支機構。

您的情況的另一種選擇是使用某種形式的IPC通信在每個客戶端進程和父進程之間進行通信。

+0

謝謝!只要將'run_once = False'改成'run_once = True'即可解決所有問題:) – Pithikos

+0

更新:您還必須評論kanaka所述的'break'語句,否則一旦斷開連接,客戶端將無法重新連接。 – Pithikos