请写一个用python3.x pool.map多进程下载文件的示例代码
自己改了一下要下载的url,一个网页,一个exe,一个PDF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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
=====================================================================================
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
2020-03-23 推荐个屏幕文字识别的软件-汉王屏幕摘抄