2013-02-12 32 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

尝试使用一个全局变量,但请确保您在每个线程和函数中将其定义为全局变量