1

2 つのスレッドを実行するプログラムの作成方法を知る必要があります。1. オブジェクトの位置 (値) を更新するスレッド 2. 最初のスレッドの値に基づいて 2 つのメソッドを実行するスレッドループ

これは私が持っている現在のコードであり、説明したように変更したいのですが、値が valueList からのものではなく、 activate(valueList) がいくつかの小さなメソッドを含むメソッドであるということではありません。よろしければ、これを解決するための例が欲しいです。ありがとう

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('59.191.193.42',5555))


screenw = 0
screenh = 0
while 1:
    client_socket.send("loc\n")
    data = client_socket.recv(8192)
    valueList = data.split()

    if (not(valueList[-1] == "eom" and valueList[0] == "start")):
        #print "continuing.."
            continue

        if(screenw != int(valueList[2])):
            screenw = int(valueList[2])
            screenh = int(valueList[3])

    activate(valueList)
4

1 に答える 1

3

他の人が指摘しているように、スレッド化が実際に問題を解決するようには見えません。特に、Python コードはGlobal Interpreter Lockの対象となるため、基本的に、コードが IO バウンド (ディスクから大きなファイルを読み取る、低速のネットワーク接続で待機するなど) の場合にのみスレッド化が役立つことを意味します。プログラムが CPU バウンドで、並列処理を本当に活用したい場合は、マルチプロセッシングが最適です。マルチプロセッシングでは、マルチコア CPU を利用する能力と引き換えに、(プロセスが作成されたときとプロセス間通信中の) メモリ オーバーヘッドとわずかな待ち時間が発生します。

並列処理があなたのプログラムに役立つことが判明した場合、または単に興味がある場合に備えて、次のコード サンプルを示します。免責事項、私はこのモジュールをインポートしようとしていないので、疑似コードと考えてください。

import socket
from multiprocessing import Process, Queue, Value
from ctypes import c_bool

HOST = '198.51.100.0'
PORT = 8080

# This function will be run in a child process
def update_proc(data_queue, update_queue, quit_flag):
    while not quit_flag.value:
        data = data_queue.get()
        # do something with the data...
        update_queue.put(data)
    print "Closing child update process"

# This function will be run in a child process
def activate_proc(update_queue, quit_flag):
    while not quit_flag.value:
        data = update_queue.get()
        # do something with the data...
    print "Closing child activate process"

# main process begins execution here, if module is run from the terminal
if __name__ == "__main__":
    # Connect to remote host over TCP
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((HOST,PORT))

    # Set up a Queue to pass data to the update process, and another one
    # for the two children to communicate
    data_queue = Queue()
    update_queue = Queue()

    # The quit_flag Value is a *very* primitive way to signal the child 
    # processes to quit. I'm sure there are better ways to do this, but I'm 
    # tired and can't think of any right now.
    quit_flag = Value(c_bool, False)

    # Create two child processes, pass a reference to the Queue to each
    update = Process(target=update_proc, args=(data_queue, update_queue, quit_flag))
    activate = Process(target=activate_proc, args=(update_queue, quit_flag))

    update.start()
    activate.start()

    # Read data from the TCP socket, push it onto the data_queue
    while True:
        client.sendall("loc\n")
        data = client.recv(8192)
        if not data:
            print "network connection closed by client"
            break
        data_queue.put(data)

    # Join with child processes before closing
    print "All done, closing child processes"
    update.join()
    activate.join()
于 2012-09-27T12:53:09.447 に答える