zoukankan      html  css  js  c++  java
  • Python中如何使用线程池和进程池?

    进程池的使用

    为什么要有进程池?进程池的概念。

    在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务。

    那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗时间,销毁进程也需要消耗时间。

    第二即便开启了成千上万的进程,操作系统也不能让他们同时执行,这样反而会影响程序的效率。

    因此我们不能无限制的根据任务开启或者结束进程。那么我们要怎么做呢?

    在这里,要给大家介绍一个进程池的概念,定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,

    等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务。如果有很多任务需要执行,池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,

    拿到空闲进程才能继续执行。也就是说,池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行。这样不会增加操作系统的调度难度,还节省了开闭进程的时间,也一定程度上能够实现并发效果。

     

    from multiprocessing import Pool
    from multiprocessing import Process
    import time
    import os
    
    def func(n):
    
        print("子进程开始: %s"%n, os.getpid())
    
        time.sleep(1)
    
        print("子进程结束: %s" % n, os.getpid())
    
    
    if __name__ == "__main__":
    
        # 开启了5个进程
        pool = Pool(5)
    
        for i in range(10):
    
            # 正常情况下先执行5个start 后执行5个end
            p = Process(target=func,args=(i,))
            p.start()

    线程池的使用

    import time
    from concurrent.futures import ThreadPoolExecutor
    
    
    def func(n):
        print(n)
        time.sleep(1)
        return n * 10
    
    
    t_lst = []
    
    # 定义一个线程池(默认 不要超过cup个数*5)
    tpool = ThreadPoolExecutor(max_workers=5)
    
    for i in range(20):
    
        # 传值(开启20个子线程)
        t = tpool.submit(func, i)
        t_lst.append(t)
    
    # 相当于 close + join
    tpool.shutdown()
    
    print("主线程")
    
    for t in t_lst:
        # t.result() 接受返回值
        print("33[31m ==== 33[0m", t.result())
  • 相关阅读:
    【业务自动化】iTop,全面支持ITIL流程的一款ITSM工具
    【Hadoop】HDFS源码解读
    【Hadoop】Hadoop RPC框架线程模型
    电商网站项目(一)用户模块---门户
    jdk1.5后枚举类的定义规则
    回顾static与final的作用
    @Springboot搭建项目controller层接收json格式的对象失败
    把一个文件中所有文件名或者文件路径读取到一个txt文件,然后在matlab中读取
    springboot用mybatis-generator自动生成mapper和model
    hibernate、mybatis、spring data 的对比
  • 原文地址:https://www.cnblogs.com/Rivend/p/12052680.html
Copyright © 2011-2022 走看看