pu369com

请写一个用python3.x pool.map多进程下载文件的示例代码

自己改了一下要下载的url,一个网页,一个exe,一个PDF

import requests
import multiprocessing
def download_file(url):
    local_filename = url.split('/')[-1]
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=8192):
                if chunk:
                    f.write(chunk)
    return local_filename
if __name__ == '__main__':
    urls = ['https://www.cnblogs.com/pu369/p/17221436.html',
            'http://www.zs.gov.cn/attachment/0/402/402310/1931387.pdf',
            'https://mksoftcdnhp.mydown.com/641c0606/c8d7945f45ef80c0f98df9ab11241922/uploadsoft/newsoft/OCR_ocr-tjxz.exe']
    with multiprocessing.Pool(processes=3) as pool:
        result = pool.map(download_file, urls)
    print(result)

  

 补充:=====================================================================================

子进程的复制范围:pool.apply_async产生的新进程会复制主进程里不在if name == 'main’里定义的代码和数据,然后运行传入的func函数。
两个进程同步的变量:因为新进程里的代码和数据是复制出来的,因此在两个进程中对两者进行更新并不会相互更新。Manager就是为了保证同一个变量在一个进程中跟新了,另一个进程中也跟着响应的更新了。
为了保证同步更新的,有时候需要引入Lock来保证操作的原子性。
使用multiprocessing的时候需要注意的几个问题是

由于上面说的子进程的复制范围:传入pool.apply_async 的函数func,必须是在if name == 'main’外定义的 函数 或者 类的成员函数
同样,如果代码写在if name == 'main’外,则会被子进程运行,因此如果在if name == 'main’外调用pool.apply_async,则会无限递归的产生子进程而报错。
最后,很多时候多进程代码报错了,但报错信息却没有打印到控制台,此时需要给代码加上try except,把可能的报错信息写入文件。
————————————————
版权声明:本文为CSDN博主「吃熊的鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yinglang19941010/article/details/127390585

=====================================================================================

posted on 2023-03-23 16:01  pu369com  阅读(48)  评论(0编辑  收藏  举报

导航