【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库中的Process或Pool类可以在主进程的基础上创建子进程,从而实现多进程并行。
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类实现的一个多进程的实例。创建了两个子进程p1和p2,分别并行执行f1和f2函数。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
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号