当前位置 主页 > 服务器问题 > Linux/apache问题 >

    python实现通过队列完成进程间的多任务功能示例

    栏目:Linux/apache问题 时间:2019-11-12 19:58

    本文实例讲述了python实现通过队列完成进程间的多任务功能。分享给大家供大家参考,具体如下:

    1.通过队列完成进程间的多任务

    import multiprocessing
    
    
    def download_data(q):
      """下载数据"""
      # 模拟从网上下载数据
      data = [11, 22, 33, 44]
    
      # 向队列中写入数据
      for temp in data:
        q.put(temp)
      print("----数据下载完成并且已存入队列----")
    
    
    def analysis_data(q):
      """数据处理"""
      waitting_analysis_data = list()
      # 从队列中获取数据
      while True:
        data = q.get()
        waitting_analysis_data.append(data)
        if q.empty():
          break
      print(waitting_analysis_data)
    
    
    def main():
      # 1.创建一个队列
      q = multiprocessing.Queue()
      q1 = multiprocessing.Process(target=download_data, args=(q,))
      q2 = multiprocessing.Process(target=analysis_data, args=(q,))
      q1.start()
      q2.start()
    
    
    if __name__ == '__main__':
      main()
    

    在这里插入图片描述

    2.进程池pool

    在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务。那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗时间,销毁进程也需要消耗时间。第二即便开启了成千上万的进程,操作系统也不能让他们同时执行,这样反而会影响程序的效率。因此我们不能无限制的根据任务开启或者结束进程。那么我们要怎么做呢?

    在这里,要给大家介绍一个进程池的概念,定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务。如果有很多任务需要执行,池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,拿到空闲进程才能继续执行。也就是说,池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行。这样不会增加操作系统的调度难度,还节省了开闭进程的时间,也一定程度上能够实现并发效果。

    案例:

    from multiprocessing import Pool
    import os, time, random
    
    
    def worker(msg):
      t_start = time.time()
      print("进程%s开始执行,进程号为%d" % (msg, os.getpid()))
      # random.random()随机生成0-1之间的浮点数
      time.sleep(random.random()*2)
      t_stop = time.time()
      print("进程",msg,"执行完成,耗时%0.2f" % (t_stop-t_start))
    
    
    def main():
      # 定义一个进程池,最大进程数为3
      po = Pool(3)
      for i in range(10):
        # Pool().apply_async(要调用的目标,(传递给目标的参数元组,))
        # 每次循环将会用空闲出来的子进程去调用目标
        po.apply_async(worker,(i,))
    
      print("----start----")
      # 关闭进程池,关闭后po不再接受新的请求
      po.close()
    # 等待po中所有子进程执行完成,必须放在close语句之后
      po.join()
    
      print("----end----")
    
    
    if __name__ == '__main__':
      main()
    

    在这里插入图片描述

    更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》

    希望本文所述对大家Python程序设计有所帮助。