python多进程库_python多进程multiprocessing模块中Queue的妙用
发布日期:2021-06-24 16:40:37 浏览次数:2 分类:技术文章

本文共 1326 字,大约阅读时间需要 4 分钟。

最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个process。Multiprocessing的使用确实能显著提升爬虫速度,不过程序交由用户使用时,缺乏一个好的GUI窗口来显示爬虫进度。之前的文章中使用了Chrome浏览器来渲染js脚本生成了进度条。但是鉴于Chrome在运行时十分吃内存资源,用Chrome只是生成一个进度条难免有些“大材小用”,所以,小爬决定使用Tkinter库来制作进度条,进而摆脱对chrome浏览器的依赖。

要制作进度条,就得有计数器存储爬虫的总数,当前的爬取数甚至是当前的耗费时间等作为存储变量。考虑到各个进程之间无法直接通信,这个当前量和总量如何得到,就只能借助multiprocessing中的Queue类了。根据官方文档,multiprocessing中的Queue 类几乎完美克隆了Queue.Queue中的功能,但是它是专为多进程间的通信单独设计的。

20190428122821371231.png

透过一个简单的例子看下Queue是如何运用的:

from multiprocessing importProcess, Queuedeff(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对象含以下方法,供用户调用:

20190428122821656398.png

比如:

1、它主要是通过q.put()来入列,该方法支持存入单个变量,也支持通过列表一次入列多个不同类型的元素,异常灵活多变。

2、q.qsize()可以得到当前队列的元素总数。

3、q.empty()可以判断当前队列中是否还有值,返回一个布尔型的结果。如:

In [36]: q.empty()

Out[36]: True

4、通过q.get()方法来出队列。

这样我们就可以灵活使用队列来在各进程间通信和制作进度条了。

我们在爬虫中,往往会遇到一个这样的情况,目录页和详情页的信息需要结合到一个item中存储起来,它就可以巧妙借助Queue来实现。

20190428122821813631.png

上面的例子中,我一次存入了url,bpmDefName,dataId,afFormNumber 等多个字段信息。

后面我们再从queue中取出一个结果,则该结果是包含 url,bpmDefName,dataId,afFormNumber 多个信息的元组。进而得到元组的每个元素与详情页的相关字段拼接到一起,形成一行信息。代码示例如下:

20190428122821996255.png

最后通过Q.qsize()方法判断队列中的元素是否已完全取出,来实时计算爬虫进度和决定后续动作,非常方便!

20190428122822106611.png

有了multiprocessing模块的Queue类和它提供的诸多方法,制作进度条和关联多个item信息,便不再是难题!

转载地址:https://blog.csdn.net/weixin_33910305/article/details/113975013 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java中gui_java中GUI是什么意思?详细图解
下一篇:python3打包pyqt5_PyQt5 打包

发表评论

最新留言

不错!
[***.144.177.141]2024年04月23日 04时04分37秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章