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()

运行结果
python3多进程之间共享变量_第1张图片
可以看到4个线程4个进程,刚好对cnt操作16次加一,结果为16。
参数对照表
python3多进程之间共享变量_第2张图片

结束语

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

你可能感兴趣的:(NLP炼丹之路)