web-dev-qa-db-ja.com

このスレッド化されたTCPServerのスレッド間でデータを共有する方法は?

私は、TCPを介してデータを送信するプロジェクトに取り組んでいます。 ThreadedTCPServerを使用すると、すでにそれを行うことができます。サーバースレッドは、データの着信文字列を読み取り、変数の値を設定するだけです。一方、これらの変数の値が変化するのを見るにはメインスレッドが必要です。これは、ThreadedTCPServerの例から変更したばかりの私のコードです。

import socket
import threading
import SocketServer

x =0

class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):

    def handle(self):
        data = self.request.recv(1024)
        # a few lines of code in order to decipher the string of data incoming
        x = 0, 1, 2, etc.. #depending on the data string it just received

class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    pass

if __name__ == "__main__":
    # Port 0 means to select an arbitrary unused port
    Host, PORT = 192.168.1.50, 5000

    server = ThreadedTCPServer((Host, PORT), ThreadedTCPRequestHandler)

    # Start a thread with the server -- that thread will then start one
    # more thread for each request
    server_thread = threading.Thread(target=server.serve_forever)
    # Exit the server thread when the main thread terminates
    server_thread.daemon = True
    server_thread.start()
    print "Server loop running in thread:", server_thread.name

    while True:
        print x
        time.sleep(1)

    server.shutdown()

したがって、これが機能する方法は、プログラムが絶えずxの値を出力し、新しいメッセージが来るとxの値が変化することです。問題は、メインスレッドで出力するxが、サーバースレッドで新しい値が割り当てられているxと同じではないことです。サーバースレッドからメインスレッドのxの値を変更するにはどうすればよいですか?

18
David Lopez

スレッド間で Queue を共有してみてください。

有用なリソース

  • Python Concurrency の紹介、David Beazleyによるプレゼンテーション)は、マルチスレッド、スレッド通信、および並行処理全般に関する優れたNiceイントロを提供します。
32