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

 更新时间:2019年10月28日 10:14:18   作者:独听钟声晚  
这篇文章主要介绍了python实现通过队列完成进程间的多任务功能,结合实例形式分析了Python队列完成进程间的多任务以及进程池pool相关操作技巧,需要的朋友可以参考下

本文实例讲述了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程序设计有所帮助。

相关文章

  • Python使用urllib2获取网络资源实例讲解

    Python使用urllib2获取网络资源实例讲解

    urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件。他以urlopen函数的形式提供了一个非常简单的接口,下面我们用实例讲解他的使用方法
    2013-12-12
  • Python远程方法调用实现过程解析

    Python远程方法调用实现过程解析

    这篇文章主要介绍了Python远程方法调用实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Python计数器collections.Counter用法详解

    Python计数器collections.Counter用法详解

    本文主要介绍了Python计数器collections.Counter用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 如何在pyqt中实现全局事件实战记录

    如何在pyqt中实现全局事件实战记录

    事件的处理机制非常的复杂,属于PyQt底层的事,不必我们关心,学会使用就行,下面这篇文章主要给大家介绍了关于如何在pyqt中实现全局事件的相关资料,需要的朋友可以参考下
    2022-02-02
  • Python实战之多种音乐格式批量转换

    Python实战之多种音乐格式批量转换

    Pydub是一个基于ffmpeg的Python音频处理模块,封装了许多ffmpeg底层接口,因此用它来做音乐歌曲文件格式转换会非常方便。今天给大家介绍它的音乐文件格式转换功能,几乎支持所有音乐音频格式,需要的可以参考一下
    2022-06-06
  • Python常见MongoDB数据库操作实例总结

    Python常见MongoDB数据库操作实例总结

    这篇文章主要介绍了Python常见MongoDB数据库操作,结合实例形式详细总结了Python针对MongoDB数据库相关pymongo库安装以及MongoDB数据库的增删改查等相关操作技巧与注意事项,需要的朋友可以参考下
    2018-07-07
  • python+pyhyper实现识别图片中的车牌号思路详解

    python+pyhyper实现识别图片中的车牌号思路详解

    最近领导给布置了一个基于图片识别车牌号的工具开发任务,然后就去研究实现逻辑,自己根据opencv写了一个小demo,发现不仅速度慢而且成功率极低。然后,就找到了Hyperlpr开源项目,这篇文章主要介绍了python+pyhyper实现识别图片中的车牌号,需要的朋友可以参考下
    2022-12-12
  • 以一个投票程序的实例来讲解Python的Django框架使用

    以一个投票程序的实例来讲解Python的Django框架使用

    这篇文章主要介绍了以一个投票程序的实例来讲解Python的Django框架使用,Django是Python世界中人气最高的MVC框架,需要的朋友可以参考下
    2016-02-02
  • Python搭建代理IP池实现接口设置与整体调度

    Python搭建代理IP池实现接口设置与整体调度

    这篇文章主要介绍了Python搭建代理IP池实现接口设置与整体调度,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Python实现类的创建与使用方法示例

    Python实现类的创建与使用方法示例

    这篇文章主要介绍了Python实现类的创建与使用方法,结合简单计算器功能实例分析了Python类的定义与使用方法,需要的朋友可以参考下
    2017-07-07

最新评论