zoukankan      html  css  js  c++  java
  • 【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
    
  • 相关阅读:
    数据结构实验之排序八:快速排序-sdut
    青蛙过河-sdut
    汉诺塔系列2-sdut
    汉诺塔-sdut
    Fighting_小银考呀考不过四级-sdut
    【JS】只能输入数字和两位小数的JS
    jQuery form 表达验证
    JS正则表达式验证数字非常全
    在lua中优雅的操作日期和时间
    lua 判断为空的逻辑
  • 原文地址:https://www.cnblogs.com/ghgxj/p/14219141.html
Copyright © 2011-2022 走看看