python3多进程之间共享变量

python3多进程之间共享变量

前言

前一篇博文尝试爬取百度百科词条作为语料,起初采用的是单进程多线程,但是速度很一般,根据爬虫的特点,属于IO密集型任务,用多线程肯定能提速,但并不是*n倍数的关系,多线程是利用一个线程阻塞的空闲让另一个线程来利用,但是python的特点,不会将线程映射到多个cpu上运行,那么在对网页数据的处理是需要消耗cpu资源的,如果利用多核cpu的优势,肯定能提升爬虫的速度。
我们知道,多线程可以共享资源,但是多进程是不行的,倘若要让多进程共同处理一个全局变量要怎么办呢?比如我们想实时打印出爬取了多少个词条,那么就要申明一个全局变量,并且每个进程每个线程都可对其操作,可能你会立马想到global关键词,毫无疑问这个思路是错的,以python开发者的尿性,肯定会有很简单的方法实现,没错确实有,那就是通过multiprocessing.Value模块实现,确实就是一行代码的事儿。

代码

from multiprocessing import Value
from multiprocessing import Pool as ProcessPool
from multiprocessing.dummy import Pool as ThreadPool

cnt = 0
num = Value('L',cnt)#通过Value实现全局变量,L表示无符号Long型,具体参数见下图。

def increat():
    num.value += 1
    
def main():
    thread = ThreadPool(4,increat)
    thread.close()
    thread.join()
    
process = ProcessPool(4,main)
process.close()
process.join()

运行结果
在这里插入图片描述
可以看到4个线程4个进程,刚好对cnt操作16次加一,结果为16。
参数对照表
在这里插入图片描述

结束语

本问主要介绍怎么实现多进程共享变量,是一个比较简单的Value的应用,多进程之间可能会遇到很多共享资源的问题,比如共享字典,列表,对象等,后面遇到了再学习。
没有具体测试采用多进程+多线程的速度对比,但是提升还是很明显的,晚上只用了4小时就爬到30W+条词条,相较于之前一下午6W+的速度🤦‍♂️。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值