Pythonプロセスプール:multiprocessing.pool

この記事はhttp://www.cnblogs.com/kaituorensheng/p/4465768.htmlに転送され、それに基づいていくつかの小さな変更が加えられました。

システム管理にPythonを使用する場合、特に複数のファイルディレクトリを同時に操作する場合、または複数のホストをリモートで制御する場合、並列操作により多くの時間を節約できます。操作オブジェクトの数が多くない場合は、マルチプロセッシングでプロセスを直接使用して、複数のプロセスを動的に生成できます。1ダースでも問題ありませんが、ターゲットが数百または数千ある場合は、手動でプロセス数を制限するのは多すぎます。面倒すぎるため、現時点ではプロセスプールの役割を果たすことができます。
プールは、ユーザーが呼び出すプロセスの指定数を提供できます。新しい要求がプールに送信されたときに、プールがいっぱいでない場合は、要求を実行するための新しいプロセスが作成されますが、プール内のプロセスの数がすでにある場合は、指定された最大値に達すると、要求はプール内のプロセスが終了するまで待機してから、新しいプロセスを作成します。

例1:プロセスプールを使用する

from multiprocessing import freeze_support,Pool
import time

def Foo(i):
 time.sleep(2)print('___time---',time.ctime())return i+100

def Bar(arg):print('----exec done:',arg,time.ctime())if __name__ =='__main__':freeze_support()
 pool =Pool(3) #スレッドプールで同時に実行されるプロセスの数は3です。(4):
  pool.apply_async(func=Foo,args=(i,),callback=Bar) #スレッドプール内で同時に実行されるプロセスの数は3です。プロセスが完了すると、実行を待機している新しいプロセスがある場合、そのプロセスが追加されます。
  # pool.apply(func=Foo,args=(i,))print('end')
 pool.close()
 pool.join()#joinを呼び出す前に、まずclose関数を呼び出してください。そうしないと、エラーが発生します。クローズが実行された後、新しいプロセスはプールに追加されません,結合関数は、すべての子プロセスが終了するのを待ちます

結果:

end
___ time--- Thu Jun 1615:11:452016----exec done:100 Thu Jun 1615:11:452016
___ time--- Thu Jun 1615:11:452016----exec done:101 Thu Jun 1615:11:452016
___ time--- Thu Jun 1615:11:452016----exec done:102 Thu Jun 1615:11:452016
___ time--- Thu Jun 1615:11:472016----exec done:103 Thu Jun 1615:11:472016

機能説明

実行手順:プロセスプールプールを作成し、プロセス数を3に設定します。xrange(4)は4つのオブジェクト[0、1、2、4]を次々に生成し、4つのオブジェクトがプールに送信されます。プールはプロセスの数を3に指定しているため、0、1、および2が直接プロセスに送信されて実行されます。いずれかが実行されると、プロセス処理オブジェクト3が空になり、出力「msg:hello3」が「end」に表示されます。 "リア。非ブロッキングであるため、main関数はそれ自体を実行し、プロセスの実行を無視します。したがって、forループを実行した後、「mMsg:hark〜Mark〜Mark ~~~~~~~~~~~~~」を直接出力します。 ~~~~~~~~ "、メインプログラムはpool.join()で各プロセスの終了を待ちます。

例2:プロセスプールを使用する(ブロッキング)

from multiprocessing import freeze_support,Pool
import time

def Foo(i):
 time.sleep(2)print('___time---',time.ctime())return i+100

def Bar(arg):print('----exec done:',arg,time.ctime())if __name__ =='__main__':freeze_support()
 pool =Pool(3) #スレッドプールで同時に実行されるプロセスの数は3です。(4):
  pool.apply(func=Foo,args=(i,))print('end')
 pool.close()
 pool.join()#joinを呼び出す前に、まずclose関数を呼び出してください。そうしないと、エラーが発生します。クローズが実行された後、新しいプロセスはプールに追加されません,結合関数は、すべての子プロセスが終了するのを待ちます

の結果

___ time--- Thu Jun 1615:15:162016
___ time--- Thu Jun 1615:15:182016
___ time--- Thu Jun 1615:15:202016
___ time--- Thu Jun 1615:15:222016
end

例3:プロセスプールを使用して、結果に注意を払います

import multiprocessing
import time

def func(msg):print('hello :',msg,time.ctime())
 time.sleep(2)print('end',time.ctime())return'done'+ msg

if __name__=='__main__':
 pool = multiprocessing.Pool(2)
 result =[]for i inrange(3):
  msg ='hello %s'%i
  result.append(pool.apply_async(func=func,args=(msg,)))

 pool.close()
 pool.join()for res in result:print('***:',res.get())print('AAAAAAAAll end--')

の結果


:get()関数は、返された各結果の値を取得します

例4:複数のプロセスプールを使用する

import multiprocessing
import time,os,random

def Lee():print('\nRun task Lee--%s******ppid:%s'%(os.getpid(),os.getppid()),'~~~~',time.ctime())
 start = time.time()
 time.sleep(random.randrange(10))
 end = time.time()print('Task Lee,runs %0.2f seconds.'%(end-start),'~~~~',time.ctime())

def Marlon():print("\nRun task Marlon-%s******ppid:%s"%(os.getpid(),os.getppid()),'~~~~',time.ctime())
 start = time.time()
 time.sleep(random.random()*40)
 end=time.time()print('Task Marlon runs %0.2f seconds.'%(end - start),'~~~~',time.ctime())

def Allen():print("\nRun task Allen-%s******ppid:%s"%(os.getpid(),os.getppid()),'~~~~',time.ctime())
 start = time.time()
 time.sleep(random.random()*30)
 end = time.time()print('Task Allen runs %0.2f seconds.'%(end - start),'~~~~',time.ctime())

def Frank():print("\nRun task Frank-%s******ppid:%s"%(os.getpid(),os.getppid()),'~~~~',time.ctime())
 start = time.time()
 time.sleep(random.random()*20)
 end = time.time()print('Task Frank runs %0.2f seconds.'%(end - start),'~~~~',time.ctime())if __name__ =='__main__':
 func_list =[Lee,Marlon,Allen,Frank]print('parent process id %s'%os.getpid())

 pool = multiprocessing.Pool(4)for func in func_list:
  pool.apply_async(func)  #プール実行機能、実行機能の適用,プロセスが実行されると、新しいプロセスがプールに追加されます

 print('Waiting for all subprocesses done...')
 pool.close()
 pool.join()    #joinを呼び出す前に、まずcloseを呼び出す必要があります()機能しないとエラーが発生します,close()実行後に新しいプロセスがプールに追加されることはありません,結合関数は、子プロセスの終了を待ちます
 print('All subprocesses done.')

の結果

parent process id 98552
Waiting for all subprocesses done...

Run task Lee--97316******ppid:98552~~~~ Thu Jun 1615:20:502016

Run task Marlon-95536******ppid:98552~~~~ Thu Jun 1615:20:502016

Run task Allen-95720******ppid:98552~~~~ Thu Jun 1615:20:502016

Run task Frank-98784******ppid:98552~~~~ Thu Jun 1615:20:502016
Task Allen runs 0.31 seconds.~~~~ Thu Jun 1615:20:512016
Task Lee,runs 7.00 seconds.~~~~ Thu Jun 1615:20:572016
Task Frank runs 14.48 seconds.~~~~ Thu Jun 1615:21:052016
Task Marlon runs 31.72 seconds.~~~~ Thu Jun 1615:21:222016
All subprocesses done.

multiprocessing pool map

# coding: utf-8import multiprocessing 

def m1(x): 
 print x * x 

if __name__ =='__main__': 
 pool = multiprocessing.Pool(multiprocessing.cpu_count()) 
 i_list =range(8)
 pool.map(m1, i_list)

1つの実行結果

0
1
4
9
16
25
36
49

参照:http://www.dotblogs.com.tw/rickyteng/archive/2012/02/20/69635.aspx

質問:http://bbs.chinaunix.net/thread-4111379-1-1.html

# coding: utf-8import multiprocessing
import logging

def create_logger(i):
 print i

classCreateLogger(object):
 def __init__(self, func):
  self.func = func

if __name__ =='__main__':
 ilist =range(10)

 cl =CreateLogger(create_logger)
 pool = multiprocessing.Pool(multiprocessing.cpu_count())
 pool.map(cl.func, ilist)

 print "hello------------>"

1つの実行結果

0
1
2
3
4
5
6
7
8
9
hello------------>

Recommended Posts

Pythonプロセスプール:multiprocessing.pool
PythonはMatlabコマンドプロセス分析を使用します
pythonスレッドプールの使用方法
Pycharmはpythonパスプロセス図を変更します
Pythonファイル操作の基本的なプロセス分析
Pythonプロセスとスレッドの要約ケース分析
pythonでexcelテーブルを処理する方法
Python置換ピップソースメソッドプロセス分析
Pythonプロセスとスレッドの要約ケース分析