希望能分享点相关的代码示例或资料
开始时想用 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()
position = 0
def dw(url, path):
r = requests.get(url, headers=HEADERS, proxies=PROXIES, stream=True)
global position
progress = tqdm(
total=int(r.headers['Content-Length']),
# unit='B',
unit_scale=True,
desc=path,
# dynamic_ncols=True,
position=position,
bar_format='{desc}{percentage}',
)
position += 1
with open(path, 'wb') as f:
for chunk in r.iter_content(1024):
progress.update(len(chunk))
f.write(chunk)
progress.close()
pool = Pool(10)
for i in urls:
# i 文件链接
# path 保存路径
inf = pool.apply_async(dw, args=(i, path))
pool.close()
pool.join()
1
mason961125 2017-08-17 00:39:44 +08:00
如果用多线程下载一个文件,那么下载的只是同一个文件的不同区域,分开显示意义不大。
|
2
rabbbit OP @mason961125 可能我表达有误,同时下载多个文件.
|
3
NoAnyLove 2017-08-17 00:49:55 +08:00 1
不同线程创建自己的 tqdm 实例,传递不同的 position 参数。话说,你们用库都不看文档的吗?
|
6
SakuraSa 2017-08-17 00:53:35 +08:00 1
多行的进度条大约需要 curses 来实现(win 下没有原生的 curses)
或者你可以使用别人弄好的,例如 blessings |
7
NoAnyLove 2017-08-17 00:59:28 +08:00 1
@rabbbit 我觉得你需要贴张图说明是什么样的 bug。另外,多个线程可以同时向终端 print,可能会造成混乱。加个锁试试。
|
8
rabbbit OP |
9
NoAnyLove 2017-08-17 08:08:39 +08:00
|
10
NoAnyLove 2017-08-17 08:18:05 +08:00
@rabbbit 上面给的 issue 的链接有我写的示例代码,需要对创建 tqdm、tqdm.update 和 tqdm.close 都要加锁。另外还有个 position 的小技巧,要从 1 开始
|