2013-07-11 2 views
1

나는 마지막 날 작동을 위해 Websockify과 싸워 왔습니다. 명백한 문서가 없으므로 나는 재판 & 오류로 일을 끝냅니다.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 연결은 오래 지속되는 경향이 있으므로 프로세스 생성 오버 헤드는 일반적으로 문제가되지 않습니다). 이는 웹 보안의 버그를 악용하여 한 클라이언트가 다른 클라이언트 연결을 수신하거나 다른 클라이언트 연결에 영향을 줄 수있는 위험을 줄이기 위해 일부 보안 격리를 제공합니다.

top_new_client 메소드에서 프로세스 생성 코드를 찾을 수 있습니다. 동일한 프로세스에서 단일 클라이언트를 처리하는 --run-once 옵션이 있습니다. 그러나 단일 연결 후에 top_new_client에서 기본 루프를 종료하도록 설계되었습니다. self.run_once 조건부 검사에서 break 문을 제거 할 수는 있지만 한 번에 둘 이상의 클라이언트를 연결할 수는 없지만 수행하려는 작업에 충분할 수도 있습니다.

WebSocketServer를 자신의 스레딩 또는 멀티 프로세싱 믹스를 제공하는 HTTPServer 클래스와 비슷하게 전환 할 수있는 진행되지 않은 코드가 있습니다. 도움이된다고 생각되면 알려주고 그것을 지점으로 밀어 낼 수 있습니다.

또 다른 옵션은 IPC 통신 형식을 사용하여 각 클라이언트 프로세스와 상위 프로세스간에 통신하는 것입니다.

+0

감사합니다. 'run_once = False'를'run_once = True'로 변경하면 모든것을 해결할 수 있습니다 :) – Pithikos

+0

업데이트 : kanaka에 명시된대로 'break' 문에 주석을 달아야합니다. 그렇지 않으면 클라이언트는 연결이 끊어지면 다시 연결할 수 없습니다 . – Pithikos

관련 문제