2013-02-12 73 views
1

對不起,如果這個問題太基本了 - 這是我第一次嘗試在Python中使用多線程套接字。Python SocketServer通過線程本地存儲將數據傳遞到主線程

基本上,我試圖編寫獲取UDPServer套接字接收數據的代碼;套接字本身在線程中運行。 爲了讓主線程可以訪問數據,我使用了Thread本地存儲(看起來這是根據我讀的所有內容做的正確方法)。下面的代碼是我第一次嘗試使它工作,但該變量似乎沒有正確更新。任何關於可能發生什麼的想法?

編輯:請參閱下面的工作示例

服務器:

import socket 
import threading 
import SocketServer 

data = threading.local() 

class UDPHandler(SocketServer.BaseRequestHandler): 

    def handle(self): 
     data.outputString = self.request[0].strip() 

class ThreadedUDPServer(SocketServer.ThreadingMixIn, SocketServer.UDPServer): 

    def __init__(self, serverAddress, handlerClass): 
     SocketServer.UDPServer.__init__(self, serverAddress, handlerClass) 
     data.outputString = "" 

if __name__ == "__main__": 

    ReceiverSocket = ThreadedUDPServer(("localhost",11111), UDPHandler) 
    ServerThread = threading.Thread(target=ReceiverSocket.serve_forever) 
    ServerThread.daemon = True 
    ServerThread.start() 

    while 1: 
     if data.outputString: 
      print data.outputString 
      data.outputString = "" 

客戶:

import socket 
import sys 

HOST, PORT = "localhost", 11111 
data = " ".join(sys.argv[1:]) 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

sock.sendto(data + "\n", (HOST, PORT)) 

謝謝!

回答

2

使它工作。是的 - 線程局部無關與此... :)

我設置了一個全局變量,並將其定義爲在每個功能的全球修改它(按this very helpful answer

import socket 
import threading 
import SocketServer 

data = "" 

class UDPHandler(SocketServer.BaseRequestHandler): 

    def handle(self): 
     global data 
     data = self.request[0].strip() 

class ThreadedUDPServer(SocketServer.ThreadingMixIn, SocketServer.UDPServer): 
    pass 

if __name__ == "__main__": 

    ReceiverSocket = ThreadedUDPServer(("localhost",11111), UDPHandler) 
    ServerThread = threading.Thread(target=ReceiverSocket.serve_forever) 
    ServerThread.start() 

    while 1: 
     if data: 
      print data 
      data = "" 
1

嘗試使用一個全局變量,但請確保您在每個線程和函數中將其定義爲全局變量