Pythonではスレッドプールとプロセスプールをどのように使用しますか?

4465 ワード

プロセスプールの使用
なぜプロセスプールがあるのですか?プロセスプールの概念.
プログラムが実際に問題を処理する過程で、忙しい時には何千もの任務が実行され、暇な時にはわずかな任務しかない可能性がある.
では、何千ものタスクが実行される必要があるとき、私たちは何千ものプロセスを作成する必要がありますか?まず、作成プロセスには時間がかかり、破棄プロセスにも時間がかかります.
第二に、何千ものプロセスが開始されても、オペレーティングシステムは同時に実行させることができず、逆にプログラムの効率に影響を与えます.
したがって、タスクに基づいてプロセスをオンまたは終了することは制限されません.どうすればいいのでしょうか?
ここでは、プロセスプールの概念を紹介し、プールを定義し、そこに一定数のプロセスを置いて、需要が来たら、プールのプロセスを持ってタスクを処理します.
処理が完了すると、プロセスは閉じるのではなく、プロセスをプロセスプールに戻してタスクを待機します.多くのタスクを実行する必要があり、プール内のプロセスの数が足りない場合は、タスクは前のプロセスがタスクを実行してから戻ってくるのを待たなければなりません.
実行を続行するには、空きプロセスを取得します.すなわち、プール内のプロセスの数が固定されている場合、同じ時間に最大固定数のプロセスが実行されます.これにより、オペレーティングシステムのスケジューリングが難しくなり、開閉プロセスの時間が節約され、同時効果もある程度実現できます.
 
from multiprocessing import Pool
from multiprocessing import Process
import time
import os

def func(n):

    print("     : %s"%n, os.getpid())

    time.sleep(1)

    print("     : %s" % n, os.getpid())


if __name__ == "__main__":

    #    5   
    pool = Pool(5)

    for i in range(10):

        #         5 start    5 end
        p = Process(target=func,args=(i,))
        p.start()

スレッドプールの使用
import time
from concurrent.futures import ThreadPoolExecutor


def func(n):
    print(n)
    time.sleep(1)
    return n * 10


t_lst = []

#        (       cup  *5)
tpool = ThreadPoolExecutor(max_workers=5)

for i in range(20):

    #   (  20    )
    t = tpool.submit(func, i)
    t_lst.append(t)

#     close + join
tpool.shutdown()

print("   ")

for t in t_lst:
    # t.result()      
    print("\033[31m ==== \033[0m", t.result())