1

この質問が基本的すぎる場合は申し訳ありません。Pythonでマルチスレッドソケットを使用するのはこれが初めてです。

基本的に、UDPServerソケットによって受信されているデータを取得するコードを作成しようとしています。ソケット自体はスレッド内で実行されています。メインスレッドがデータにアクセスできるようにするために、私はスレッドローカルストレージを使用しています(私が読んだすべてのものに基づいて、それを行う正しい方法のようです)。以下のコードは、それを機能させるための最初の試みですが、変数が適切に更新されていないようです。何が起こっているのかについて何か考えはありますか?

編集:実用的な例については、以下を参照してください

サーバ:

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))

ありがとう!!

4

2 に答える 2

3

それを機能させました。そしてそうです-スレッドローカルはこれとは何の関係もありません...:)

私はグローバル変数を設定し、それを変更する各関数でグローバルとして定義しました(この非常に役立つ回答に従って)

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 = ""
于 2013-02-13T05:16:55.367 に答える
1

グローバル変数を使用してみてください。ただし、すべてのスレッドと関数でグローバル変数として定義していることを確認してください。

于 2013-08-10T23:32:42.447 に答える