python多进程multiprocessing模块中Queue的妙用
最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个process。Multiprocessing的使用确实能显著提升爬虫速度,不过程序交由用户使用时,缺乏一个好的GUI窗口来显示爬虫进度。之前的文章中使用了Chrome浏览器来渲染js脚本生成了进度条。但是鉴于Chrome在运行时十分吃内存资源,用Chrome只是生成一个进度条难免有些“大材小用”,所以,小爬决定使用Tkinter库来制作进度条,进而摆脱对chrome浏览器的依赖。
要制作进度条,就得有计数器存储爬虫的总数,当前的爬取数甚至是当前的耗费时间等作为存储变量。考虑到各个进程之间无法直接通信,这个当前量和总量如何得到,就只能借助multiprocessing中的Queue类了。根据官方文档,multiprocessing中的Queue 类几乎完美克隆了Queue.Queue中的功能,但是它是专为多进程间的通信单独设计的。
透过一个简单的例子看下Queue是如何运用的:
from multiprocessing import Process, Queue def f(q):
q.put([42, None, 'hello']) if __name__ == '__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
print q.get() # prints "[42, None, 'hello']"
p.join()
从上面的例子可以看到,此处的Queue示例出的q对象非常灵活,使用Ipython的代码提示功能可以轻松知道q对象含以下方法,供用户调用:
比如:
1、它主要是通过q.put()来入列,该方法支持存入单个变量,也支持通过列表一次入列多个不同类型的元素,异常灵活多变。
2、q.qsize()可以得到当前队列的元素总数。
3、q.empty()可以判断当前队列中是否还有值,返回一个布尔型的结果。如:
In [36]: q.empty()
Out[36]: True
4、通过q.get()方法来出队列。
这样我们就可以灵活使用队列来在各进程间通信和制作进度条了。
我们在爬虫中,往往会遇到一个这样的情况,目录页和详情页的信息需要结合到一个item中存储起来,它就可以巧妙借助Queue来实现。
上面的例子中,我一次存入了url,bpmDefName,dataId,afFormNumber 等多个字段信息。
后面我们再从queue中取出一个结果,则该结果是包含 url,bpmDefName,dataId,afFormNumber 多个信息的元组。进而得到元组的每个元素与详情页的相关字段拼接到一起,形成一行信息。代码示例如下:
最后通过Q.qsize()方法判断队列中的元素是否已完全取出,来实时计算爬虫进度和决定后续动作,非常方便!
有了multiprocessing模块的Queue类和它提供的诸多方法,制作进度条和关联多个item信息,便不再是难题!
更详细的multiprocessing模块的Queue类介绍,可以参见python官方的文档说明:
https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Queue
python多进程multiprocessing模块中Queue的妙用的更多相关文章
- Python(多进程multiprocessing模块)
day31 http://www.cnblogs.com/yuanchenqi/articles/5745958.html 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分 ...
- python 多进程multiprocessing 模块
multiprocessing 常用方法: cpu_count():统计cpu核数 multiprocessing.cpu_count() active_children() 获取所有子进程 mult ...
- 多进程 multiprocessing 模块进程并发Process;Pool ;Queue队列 、threading模块;
multiprocessing 模块中的 Process类提供了跨平台的多进程功能,在windows和linux系统都可以使用. 1.首先要实例化一个类,传入要执行的函数. 实例名 = Process ...
- Python之multiprocessing模块的使用
作用:Python多进程处理模块,解决threading模块不能使用多个CPU内核,避免Python GIL(全局解释器)带来的计算瓶颈. 1.开启多进程的简单示例,处理函数无带参数 #!/usr/b ...
- Python多进程multiprocessing使用示例
mutilprocess简介 像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的利用率会比threading好的多. import multipr ...
- 多进程Multiprocessing模块
多进程 Multiprocessing 模块 先看看下面的几个方法: star() 方法启动进程, join() 方法实现进程间的同步,等待所有进程退出. close() 用来阻止多余的进程涌入进程池 ...
- Python的collections模块中namedtuple结构使用示例
namedtuple顾名思义,就是名字+元组的数据结构,下面就来看一下Python的collections模块中namedtuple结构使用示例 namedtuple 就是命名的 tuple,比较 ...
- Python使用functools模块中的partial函数生成偏函数
所谓偏函数即是规定了固定参数的函数,在函数式编程中我们经常可以用到,这里我们就来看一下Python使用functools模块中的partial函数生成偏函数的方法 python 中提供一种用于对函数固 ...
- Python 多进程 multiprocessing.Pool类详解
Python 多进程 multiprocessing.Pool类详解 https://blog.csdn.net/SeeTheWorld518/article/details/49639651
随机推荐
- javac编译后运行提示找不到或无法加载主类
第一种常见错误: package demo_01; public class hello { public static void main(String[] args) { System.out.p ...
- Android 后台应用保活、消息推送
3.针对以往Android版本的各种保活技术回顾 Android P之前为了搞定客户的投诉:“为什么微信能收到消息而你们的IM却不能?”,为了解决这个“痛点”,广大的Android开发者们只能让各种黑 ...
- 使用java的Calendar工具类获取到本月的第一天起始时间和最后一天结束时间。
1.使用java的Calendar工具类获取到本月的第一天起始时间和最后一天结束时间. package com.fline.aic.utils; import java.text.DateFormat ...
- python之cookie, cookiejar 模拟登录绕过验证
0.思路 如果懒得模拟登录,或者模拟登录过于复杂(多步交互或复杂验证码)则人工登录后手动复制cookie(或者代码读取浏览器cookie),缺点是容易过期. 如果登录是简单的提交表单,代码第一步模拟登 ...
- Java 使用blob对H5视频播放进行加密《java视频加密》
1.创建一个H5 <video>标签 <video id="sound" type="video/mp4" controls="co ...
- ISP PIPLINE (二) LensShading Correct
what is the LSC? lens shading 分为:Y-shading , color shading. 在讲LSC之前,我们先来理解一个重要的术语--CRA(Chief ray ang ...
- Python(一)缺点
(一)慢~~~ (二)Python不能加密
- Go语言基础之切片
Go语言基础之切片 本文主要介绍Go语言中切片(slice)及它的基本使用. 引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. 例如: func arraySum(x ...
- 解析CommandMessage
Json 解析: void CommandMessage::ParseCmdBody() { try { Json::Reader reader; Json::Value root; if (!rea ...
- 自学stm32的一些个人经验
1.首先我们先看看与STM32相关的文档 我们假定大家已经对STM32的书籍或者文档有一定的理解.如不理解,请立即阅读STM32的文档,以获取最基本的知识点. 如果你手上拥有ST官方主推的STM32神 ...