如何实现多线程下载时,同时显示多个进度条?

2017-08-16 23:45:44 +08:00
 rabbbit

希望能分享点相关的代码示例或资料

开始时想用 tqdm 来着,但总有显示串行等奇怪的 bug.

相关代码大致如下:

from tqdm import tqdm
from multiprocessing.dummy import Pool

def dw(url):
    r = requests.get(url, stream=True)
    size = int(r.headers['Content-Length'])
    progress = tqdm(total=size)
    with open('file', 'wb') as f:
        for chunk in r.iter_content(1024):
            progress.update(len(chunck))
            f.write(chunck)
    progress.close()


pool = Pool(5)
for i in urls:
    pool.apply_async(dw,args=(i))
pool.close()
pool.join()
6340 次点击
所在节点    Python
10 条回复
mason961125
2017-08-17 00:39:44 +08:00
如果用多线程下载一个文件,那么下载的只是同一个文件的不同区域,分开显示意义不大。
rabbbit
2017-08-17 00:43:08 +08:00
@mason961125 可能我表达有误,同时下载多个文件.
NoAnyLove
2017-08-17 00:49:55 +08:00
不同线程创建自己的 tqdm 实例,传递不同的 position 参数。话说,你们用库都不看文档的吗?
rabbbit
2017-08-17 00:52:01 +08:00
@NoAnyLove 试过了,还是有 bug.
NoAnyLove
2017-08-17 00:52:57 +08:00
@rabbbit 具体什么样的 bug ?
SakuraSa
2017-08-17 00:53:35 +08:00
多行的进度条大约需要 curses 来实现(win 下没有原生的 curses)

或者你可以使用别人弄好的,例如 blessings
NoAnyLove
2017-08-17 00:59:28 +08:00
@rabbbit 我觉得你需要贴张图说明是什么样的 bug。另外,多个线程可以同时向终端 print,可能会造成混乱。加个锁试试。
rabbbit
2017-08-17 01:03:10 +08:00
@NoAnyLove
i.imgur. com/90RV9G6

(没办法只能切开,v2ex 这条回复无法由太新的账号发出)
链接重复显示,实际上红圈里文件上就下载了一次
NoAnyLove
2017-08-17 08:08:39 +08:00
NoAnyLove
2017-08-17 08:18:05 +08:00
@rabbbit 上面给的 issue 的链接有我写的示例代码,需要对创建 tqdm、tqdm.update 和 tqdm.close 都要加锁。另外还有个 position 的小技巧,要从 1 开始

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/383517

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX