マルチプロセスとプロセスプールの作成

2969 ワード

1、マルチプロセスを使用して2つのサブプロセスを作成する
import multiprocessing
import time

def test1():
    while True:
        print("------1-------")
        time.sleep(1)
def test2():
    while True:
        print("------2-------")
        time.sleep(1)

def main():
    p1 = multiprocessing.Process(target=test1)
    p2 = multiprocessing.Process(target=test2)
    p1.start()
    p2.start()
    print("-----main------")


if __name__=="__main__":
    main()

ps-auxを使用してすべてのプロセスステータスを表示し、自分で作成したpythonプロセスを表示し、kill PIDを使用してプロセスを破棄します.
2、キューを使用してプロセス間のデータ共有を実現する(redisはメッセージキューを通じてプロセス資源共有を実現することができる)
import multiprocessing
import time

def download_from_wed(q):
    #           
    data = [11,22,33,44]

    #          
    for temp in data:
        q.put(temp)

    print("---                  ---")

def analysis_data(q):
    "    "
    #         
    waitting_analysis = list()
    while True:
        data = q.get()
        waitting_analysis.append(data)

        if q.empty():
            break

    #        
    print(waitting_analysis)
def main():
    # 1\      
    q = multiprocessing.Queue()

    # 2\      ,              
    p1 = multiprocessing.Process(target=download_from_wed,args=(q,))
    p2 = multiprocessing.Process(target=analysis_data,args=(q,))

    p1.start()
    p2.start()



if __name__=="__main__":
    main()

3、プロセスプールを使ってマルチタスクを実現する
from multiprocessing import Pool
import os,time,random

def worker(msg):
    t_start = time.time()
    print("%s    ,    …%",(msg,os.getpid()))
    #random.random()      0-1      
    time.sleep(random.random()*2)
    t_stop = time.time()
    print(msg,"    ,  %0.2f"%(t_stop-t_start))


po = Pool(3)  #        ,      3
for i in range(0,10):
    # Pool.apply_async(      ,(          ))
    #                     
    po.apply_async(worker,(i,))

print("---start---")
po.close() #      ,   po        ,              join
po.join() #   po           ,    close    
print("---end---")

注意:サブスレッドとサブプロセスを作成すると、メインスレッドとメインプロセスはデフォルトでサブスレッドとサブプロセスが終了するまで待機しますが、プロセスプールではデフォルトのメインプロセスは待機しないので、join()メソッドを使用してサブプロセスが終了するのを待つ必要があります.forループは、プロセスプールにタスクを追加し、追加が完了した後にclose()メソッドを使用して他のリクエストを閉じます.すなわち、プロセスプールがタスクを追加し続けることができなくなり、join()メソッドを使用して紫禁城の実行が完了してから終了します.
印刷されたプロセスID番号を見てみましょう.PIDの再利用は3つしかありません.プロセスプールを使用して作成されたプロセスは、タスクが完了するまでプロセスを破棄したり再作成したりするのではなく、最初に作成されたプロセスを再利用するため、プロセスの再破壊と作成のコストを削減し、タスクの実行を高速化します.
---start---
%s    ,    …% (0, 20599)
%s    ,    …% (1, 20600)
%s    ,    …% (2, 20601)
1     ,  0.91
%s    ,    …% (3, 20600)
2     ,  1.41
%s    ,    …% (4, 20601)
3     ,  0.71
%s    ,    …% (5, 20600)
0     ,  1.67
%s    ,    …% (6, 20599)
4     ,  0.96
%s    ,    …% (7, 20601)
6     ,  0.97
%s    ,    …% (8, 20599)
7     ,  0.29
%s    ,    …% (9, 20601)
9     ,  0.46
5     ,  1.75
8     ,  1.95
---end---