【Python学習】マルチプロセス
マルチプロセス
linuxプラットフォームの例:
Unix/Linuxオペレーティングシステムは、非常に特殊な
サブプロセスは常に
Windowsの例
マルチプロセスキューによるプロセス間通信
linuxプラットフォームの例:
Unix/Linuxオペレーティングシステムは、非常に特殊な
fork()
システム呼び出しを提供します.通常の関数呼び出しは、1回呼び出され、1回返されますが、fork()
は1回呼び出され、2回返されます.これは、オペレーティングシステムが現在のプロセス(親プロセスと呼ばれる)を自動的に1部(子プロセスと呼ばれる)コピーし、親プロセスと子プロセス内でそれぞれ返すためです.サブプロセスは常に
0
を返し、親プロセスはサブプロセスのIDを返します.このようにする理由は、1つの親プロセスがforkで多くのサブプロセスを出すことができるため、親プロセスは各サブプロセスのIDをメモし、サブプロセスはgetppid()
を呼び出すだけで親プロセスのIDを取得することができるからである.import os,random
print 'Process (%s) start...' % os.getpid()
p1 = os.fork()
if pid==0:
# 0
print 'I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid())
else:
# ID
print 'I (%s) just created a child process (%s).' % (os.getpid(), pid)
Windowsの例
from multiprocessing import Process
import os
#
def run_proc(name):
print 'Run child process %s (%s)...' % (name, os.getpid())
# Process , start()
#join() ,
if __name__=='__main__':
print 'Parent process %s.' % os.getpid()
p = Process(target=run_proc, args=('test',))
print 'Process will start.'
p.start()
p.join()
print 'Process end.'
# :
Parent process 928.
Process will start.
Run child process test (929)...
Process end.
マルチプロセスキューによるプロセス間通信
from multiprocessing import Process, Queue
import os, time, random
# :
def write(q):
for value in ['A', 'B', 'C']:
print 'Put %s to queue...' % value
q.put(value)
time.sleep(random.random())
# :
def read(q):
while True:
value = q.get(True)
print 'Get %s from queue.' % value
if __name__=='__main__':
# Queue, :
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
# pw, :
pw.start()
# pr, :
pr.start()
# pw :
pw.join()
# pr , , :
pr.terminate()
:
Put A to queue...
Get A from queue.
Put B to queue...
Get B from queue.
Put C to queue...
Get C from queue.