python 进程池

2019-09-25  本文已影响0人  足__迹

进程池

Pool常用方法:

-apply_async(func ,args,kwds) : 使用非阻塞的方法调用func(并行执行,堵塞方式等待上个进程退出才能执行下一个进程),args为func的参数列表,args为func的关键字参数列表

'''
1,进程池的基本操作
'''

from multiprocessing import Pool
import time,os

def work1():
    for i in range(10):
        print('work1-------{}---{}'.format(i,os.getpid()))
        time.sleep(0.1)

def work2():
    for i in range(10):
        print('work2-------{}---{}'.format(i,os.getpid()))
        time.sleep(0.1)

def main():
    po = Pool(5) #创建一个进程池,池中有5个进程
    for i in range(10):  #依次从进程池中拿出进程,创建10个进程,实际每次最多获取5个,其他等待
          po.apply_async(work1)

    for i in range(10):  #依次从进程池中拿出进程,创建10个进程,实际每次最多获取5个,其他等待
          po.apply_async(work2)

    po.close()  #关闭进程池,进程池不在接收新的任务
    po.join()   #等待主进程执行

if __name__ == '__main__':
    main()

进程池之间的通讯

进程池也不能使用queue,进程池有自己的队列Manager

'''
1,进程池的基本操作\
2,进程池的通讯,队列
'''

from multiprocessing import Pool,Manager
import time,os

def work1(q):
    for i in range(10):
        print('work1-------{}---{}'.format(i,os.getpid()))
        q.put(1)

        time.sleep(0.1)

def work2(q):
    for i in range(10):
        print('work2-------{}---{}'.format(i,os.getpid()))
        time.sleep(0.1)
        print('获取队列的值',q.get())

def main():

    q1 =Manager().Queue()

    po = Pool(5) #创建一个进程池,池中有5个进程
    for i in range(10):  #依次从进程池中拿出进程,创建10个进程,实际每次最多获取5个,其他等待
          po.apply_async(work1,(q1,))

    for i in range(10):  #依次从进程池中拿出进程,创建10个进程,实际每次最多获取5个,其他等待
          po.apply_async(work2,(q1,))

    po.close()  #关闭进程池,进程池不在接收新的任务
    po.join()   #等待主进程执行

if __name__ == '__main__':
    main()

进程,线程,协程的比较
1,进程是资源分配的单位
2,线程是操作系统调度的单位
3,线程切换需要的资源很大,效率很低
4,线程切换需要资源一般,效率一般
5,协程切换任务的资源最小,效率高
6,多进程,多线程根据cpu的核数可能是并行,但是协程是在一个线程中,所以是并发
7,python中的线程由于GIL锁,不能实现并行操作

常见问题

1, image.png

进程池已经关闭不在接收新的任务

上一篇 下一篇

猜你喜欢

热点阅读