使用multiprocessing模塊創建多進程:
import os
from multiprocessing import Process
#子進程要執行的代碼
def run_proc(name):
print('Child process %s (%s)Running...' %(name,os.getpid()))
if __name__=='__main__':
print('Parent poecess %s.' % os.getpid())
for i in range(5):
p=Process(target=run_proc,args=(str(i),))
print('Process will start.')
p.start()
p.join()
print('Process end.')
執行效果:
使用multiprocessing模塊中的Pool類代表進程池對象:
Pool可以提供指定數量的進程供用戶調用,默認大小是CPU的核數。
from multiprocessing import Pool
import os,time,random
def run_task(name):
print('Task %s (pid=%s) is running...' % (name,os.getpid()))
time.sleep(random.random()*3)
print('Task %s end.' % name)
if __name__=='__main__':
print('Current process %s.' % os.getpid())
p=Pool(processes=3)#指定創建進程池大小爲3,用p=Pool()則進程池大小爲CPU核數
for i in range(5):
p.apply_async(run_task,args=(i,))
print('Wating for all subprocess done...')
p.close()
p.join()
print('All subprocesses done.')
執行效果:
進程間通信:
Queue通信方式
from multiprocessing import Process,Queue
import os,time,random
#寫數據進程執行的代碼
def proc_write(q,urls):
print('Process(%s) is writing...' % os.getpid())
for url in urls:
q.put(url)
print('Put %s to queue...' % url)
time.sleep(random.random())
#讀數據進程執行的代碼
def proc_read(q):
print('Process (%s) is reading...' % os.getpid())
while True:
url=q.get(True)
print('Get %s from queue.' % url)
if __name__=='__main__':
#父進程創建Queue,並傳給各個子進程
q=Queue()
proc_writer1=Process(target=proc_write,args=(q,['url_1','url_2','url_3']))
proc_writer2=Process(target=proc_write,args=(q,['url_4','url_5','url_6']))
proc_reader=Process(target=proc_read,args=(q,))
#啓動子進程proc_writer寫入
proc_writer1.start()
proc_writer2.start()
#啓動子進程proc_read讀取:
proc_reader.start()
#等待proc_writer結束:
proc_writer1.join()
proc_writer2.join()
#proc_read進程裏是死循環,無法等待其結束,只能強行終止
proc_reader.terminate()
執行效果: