请写一个用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
=====================================================================================