1

私はこのコードを持っていますが、複数のスレッドを指定するとパフォーマンスが低下することに気付きました。ここでの概念は単純です。マルチプロセッシングでキューをセットアップし、各スレッドから均等にアクセスします。ここでは、簡単に割り切れるキュー サイズを使用していることに注意してください。

import time
from  multiprocessing import Process, Queue

def worker(q,x):
    for i in range(x):
        message = q.get()


if __name__ == "__main__":

    workers=[]
    threads=1
    x = int(1000000/threads) #break up the work for each thread
    q = Queue()

    for i in range(threads):
        p=Process(target=worker, args=(q,x))
        workers.append(p)


    print('creating queue')
    for num in range(1000000):
        q.put("MESSAGE")

    start_time = time.time()

    print('starting jobs')
    for p in workers:
        p.start()

    print('waiting until jobs finish')
    for p in workers:
        p.join()

    end_time = time.time()

    duration = end_time - start_time
    msg_per_sec = 1000000 / duration

    print ("Duration: %s" % duration)
    print ("Messages Per Second: %s" % msg_per_sec)

urllib リクエストを実行するマルチプロセッシング スレッドを使用して別のスクリプトを作成しましたが、プロセッサのスケーリングが高速化に役立つことが示されています。すべてのプロセスからキューにアクセスしていて、本質的にブロックしているということですか?

4

1 に答える 1

3

問題は、あなたの労働者が有用な仕事をしていないことです。すべての時間は、キューからアイテムを取得するために費やされます。キューは共有され、キューへのすべてのアクセスはシリアル化されるため、スピードアップはありません。

ワーカーが各メッセージを処理するために CPU または I/O 時間を取り始めると、状況は改善し始めます。

アムダールの法則を参照してください。

于 2013-01-03T18:55:45.097 に答える