pythonプロセス

2689 ワード

pythonプロセスプールPool
作成するサブプロセスの数が少ない場合、multiprocessingのProcessを直接利用して複数のプロセスを動的に生成することができますが、100以上千以上のターゲットであれば、手動でプロセスを作成する作業量が大きく、multiprocessingモジュールが提供するPoolメソッドを使用することができます.
初期化Poolは、最大プロセス数を指定できます.新しいリクエストがPoolにコミットされた場合は、まだ食べていない場合は、リクエストを実行するために新しいプロセスが作成されます.ただし、プール内のプロセス数が指定した最大値に達している場合、リクエストは、プール内のプロセスが終了するまで待機し、前のプロセスで新しいタスクを実行します.
import multiprocessing
import time
import os
import random


def test1(msg):
        t_start = time.time()   
        print("%s    ,    %d" % (msg, os.getpid()))
        time.sleep(random.random() * 2)  
        t_stop = time.time()
        print("%s    ,  %.2f" % (msg, t_stop - t_start)) 


if __name__ == "__main__":
    
        po = multiprocessing.Pool(3)
        for i in range(0, 10):
                # Pool().apply_async(      ,(          ,))
                #                     
                po.apply_async(test1, (i,))
    
        print("-----start-----")
    
        po.close() #      ,   po        
        po.join() #   po          ,    close    

        print("-----end-----")

  
multiprocessing.Pool共通関数解析:
  • apply_async(func[,args[,kwds]):非ブロック方式を使用してfuncを呼び出す(並列実行、ブロック方式は前のプロセスの終了を待たなければ次のプロセスを実行できない)、argsはfuncに渡されるパラメータリスト、kwdsはfuncに渡されるキーワードパラメータリストである.
  • close():Poolを閉じて、新しいタスクを受け入れないようにします.
  • terminate():タスクが完了するかどうかにかかわらず、すぐに終了します.
  • join():メインプロセスがブロックされ、サブプロセスの終了を待つには、closeまたはterminateの後に使用する必要があります.

  • pythonプロセスプールのQueue
    Poolを使用してプロセスを作成する場合はmultiprocessingを使用する必要があります.Multiprocessingではなく、Manager()のQueue()です.Queue()です.そうしないと、次のようなエラーメッセージが表示されます.
    RuntimeError:Queue objects should only be shared between processes through inheritance.
    次の例では、プロセスプール内のプロセスがどのように通信するかを示します.
    import os
    import multiprocessing
    import time
    
    
    def write(q):
            print("write  (%s),    (%s)" % (os.getpid(), os.getppid()))
            for i in "python":
                    q.put(i)
    
    
    def read(q):
            print("read  (%s),    (%s)" % (os.getpid(), os.getppid()))
            for i in range(q.qsize()):
                    print("read Queue     :%s" % q.get(True))    
    
    
    if __name__ == "__main__":
            print("(%s) start" % os.getpid())
            q = multiprocessing.Manager().Queue()
            po = multiprocessing.Pool()
            po.apply_async(write, args=(q,))
    
            time.sleep(2)   
        
            po.apply_async(read, args=(q,))
            po.close()
            po.join()
        
            print("(%s) end" % os.getpid())                                    
    

    転載:https://www.cnblogs.com/zhangfengxian/p/python-process-pool.html