美文网首页
python 进程池

python 进程池

作者: 足__迹 | 来源:发表于2019-09-25 18:59 被阅读0次

进程池

  • 当我们创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态生成,但是同时创建成百上千,需要用到multiprocessing中Pool方法
  • 初始还Pool可以指定一个最大进程数,当有新的请求到达Pool时,如果池还没有满,就会创建一个新的进程,如果已经达到最大值,就会等待,直到进程池的进程执行结束,才会执行等待的进程

Pool常用方法:

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

  • close() : 关闭pool,使其不再接收新的任务
  • join () : 主线程阻塞,等待子进程退出,必须在close之后
    举例:
'''
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

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

相关文章

  • python学习-线程、进程简洁使用

    python的线程池和进程池很pythonic 进程 from multiprocessing import Po...

  • python使用ProcessPoolExecutor问题总结

    python版本:3.7.10 进程池启动需要从主进入__name__=="__mian__' 进程池的futur...

  • 使用池来实现并发服务器

    python自带池 进程池和线程池创建用的是同一个模块(multiprocessing),但方法不同,进程池的方法...

  • python笔记3

    python 无线程池 ,有进程池 阻塞 意外着等待子进程结束 字典的无序性 : 进程,线程,协程 协程,又称微...

  • python进程池

    串行进程池: 并行进程池: 在并行池中必须先close再join,不然打印end后就直接结束了,进程池中的进程还未...

  • python进程池

    近日学习python的多进程,遇到了一个坑,在此记录一下。代码如下: 其中一次输出: emmm....好像哪里有些...

  • Python 进程池

    当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果...

  • python 进程池

    进程池 当我们创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态生成,但是同...

  • Python进程池

    进程池Pool 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生...

  • python进程池

    详细参考[https://liwt31.github.io/2021/05/29/pool/]

网友评论

      本文标题:python 进程池

      本文链接:https://www.haomeiwen.com/subject/iihtyctx.html