以下内容是根据《Python爬虫开发与项目实战》一书学习时整理的,如果内容涉及到侵权等问题,请联系本人删稿。如果内容知识点有问题,也请联系本人,及时改正。
c、multiprocessing模块提供了一个Pool类来代表进程池对象
关于进程池的概念,请参见:https://blog.csdn.net/eagle_1036077338/article/details/72853178
Pool类似于进程池,可以提供指定数量的进程给用户调用,默认大小是CPU核数。程序运行时,如果有新的请求提出交到Pool中,并且进程池还没有满的时候,就会创建一个新的进程来给这个请求。但如果进程池已经满了,该请求就会等待,直到有别的请求的进程完成后,才会开始创建一个进程给该请求。
#coding=utf-8
'''
multiprocessing模块
Pool类来代表进程池对象
'''
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) #向Pool请求3个进程
for i in range(5):
p.apply_async(run_task,args=(i,)) #创建5个任务
print ('Waiting for all subprocesses done...')
# Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close()
# 调用close()之后就不能继续添加新的Process了
p.close()
p.join()
print ('All subprocesses done')
d、进程间通信
Queue通信方式
Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。有俩个方法:Put 和 Get
》》》Put 方法:用以插入数据到队列中,有俩个参数:blocked 和 timeout。
1> blocked为默认值true并且timeout为正值时,put方法会阻塞timeout指定的时间,直到该队列有剩余
的空间。如果超时,会抛出异常Queue.Full。
2>blocked为False,但是该队列已满,也会抛出异常。
》》》Get 方法:可以在队列里面读取并且删除一个元素。有俩个参数:blocked 和 timeout。
1> blocked为默认值true并且timeout为正值时,则在等待时间内不会取到任何元素,并且抛出异常:Queue.Empty
2> blocked为false时,如果Queue有可用的值,则会返回该值,如果队列为空,就会抛出异常