【python】多进程的简单实现

安装依赖

pip3 install multiprocess

单个进程

单个进程其实就是只有一个主进程。程序代码在主进程的控制下顺序执行。

def f1():
    for _ in range(3):
        print('hello') 


def f2():
    for _ in range(3):
        print('world')


if __name__ == "__main__":
    f1()
    f2()

上方代码就是一个单进程的实例。先执行函数f1,再执行函数f2,所以程序的最终输出结果为:

hello
hello
hello
world
world
world

多个进程

调用multiprocessing库中的ProcessPool类可以在主进程的基础上创建子进程,从而实现多进程并行。

Process

from multiprocessing import Process


def f1(n):
    for _ in range(n):
        print('hello')


def f2(n):
    for _ in range(n):
        print('world')


if __name__ == "__main__":
    p1 = Process(target=f1, args=(3,))
    p2 = Process(target=f2, args=(3,))
    p1.start()
    p2.start()

上方代码就是用Process类实现的一个多进程的实例。创建了两个子进程p1p2,分别并行执行f1f2函数。target指向函数名,args接受元组类型的输入,用于给函数传参。某次运行的输出结果如下,可以看出程序不再是顺序输出。

hello
hello
world
hello
world
world

Pool

Pool类通过创建进程池实现多个进程的并行。一般网络爬虫都会用到进程池,比如批量下载图片或视频。

from multiprocessing import Pool
import requests


def down(url):
    res = requests.get(url)
    with open(url.split('/')[-1], 'wb') as f:
        f.write(res.content)


if __name__ == '__main__':
    urls = [
        'https://i.loli.net/2020/09/22/dALSOKcGJy1alwY.jpg',
        'https://i.loli.net/2020/09/22/N9UQXnzwEZi3Kbc.jpg',
        'https://i.loli.net/2020/09/22/pA3r58VXws9lua6.jpg',
        'https://i.loli.net/2020/09/22/G9HNuZMRzYm51tO.jpg',
        'https://i.loli.net/2020/09/22/p2SKVYaGDTH1J7q.jpg',
        'https://i.loli.net/2020/09/22/AHsIG1V4nBOUcdy.jpg',
        'https://i.loli.net/2020/09/22/9dnLoiNfWjRpVPG.jpg',
        'https://i.loli.net/2020/09/22/8eAw6maBlfrdDEn.jpg',
    ]
    with Pool(8) as p:
        p.map(down, urls)

上方代码创建了一个8进程的进程池用于批量下载url图片。Pool(8)指定进程池的进程数是8,如果不指定,那么默认是CPU的核心数,其实一般不用指定,默认即可。

时间分析

这里小编计算了一下下载时间。8个进程并行下载8张图片总计用时2秒多,单进程下载总计需要8~9秒。但是一般爬虫都是下载几百张,甚至几千张,这时如果设置进程池就能极大的节省下载时间。

引用参考

https://docs.python.org/zh-cn/3/library/multiprocessing.html#module-multiprocessing
原文地址:https://www.cnblogs.com/ghgxj/p/14219141.html