この記事はhttp://www.cnblogs.com/kaituorensheng/p/4465768.htmlに転送され、それに基づいていくつかの小さな変更が加えられました。
システム管理にPythonを使用する場合、特に複数のファイルディレクトリを同時に操作する場合、または複数のホストをリモートで制御する場合、並列操作により多くの時間を節約できます。操作オブジェクトの数が多くない場合は、マルチプロセッシングでプロセスを直接使用して、複数のプロセスを動的に生成できます。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()で各プロセスの終了を待ちます。
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
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()関数は、返された各結果の値を取得します
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.
# 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------------>