【发布时间】:2017-01-30 07:57:47
【问题描述】:
我有一个要下载(例如压缩档案)的大文件的 URL 列表,我想处理(例如解压缩档案)。
下载和处理都需要很长时间,并且磁盘 IO 上的处理很繁重,所以我希望一次只运行一个。由于这两个任务花费大约相同的时间并且不竞争相同的资源,因此我想在处理最后一个文件时下载下一个文件。
这是 producer-consumer problem 的变体。
情况与reading and processing images 或downloading loads of files 类似,但我的下载程序调用(还)不能picklable,所以我无法使用多处理,而且这两个任务花费的时间差不多。
这是一个虚拟示例,下载和处理都被阻塞:
import time
import posixpath
def download(urls):
for url in urls:
time.sleep(3) # this is the download (more like 1000s)
yield posixpath.basename(url)
def process(fname):
time.sleep(2) # this is the processing part (more like 600s)
urls = ['a', 'b', 'c']
for fname in download(urls):
process(fname)
print(fname)
如何使这两个任务同时进行?我可以使用yield 或yield from in a smart way,或者与deque 结合使用吗?还是必须是asyncio 和Future?
【问题讨论】:
-
不,不完全是。那是关于多个并发下载。我一次只需要下载一个,消费者应该知道每个新文件。
标签: python concurrency yield coroutine yield-from