簡體   English   中英

Python SocketServer通過Thread本地存儲將數據傳遞給主線程

[英]Python SocketServer passing data to the main thread via Thread local storage

很抱歉,如果這個問題太基礎了 - 這是我第一次嘗試在Python中使用多線程套接字。

基本上,我正在嘗試編寫獲取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))

謝謝!!

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

我已經設置了一個全局變量,並在修改它的每個函數中將其定義為全局變量(根據這個非常有用的答案

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 = ""

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM