使用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()
执行效果: