我有一组URL指向大文件(例如压缩档案)需要下载,然后再进行处理(例如解压缩)。由于下载和处理都需要较长时间,而且处理过程对磁盘IO要求很高,因此我希望每次只运行一个任务。由于两个任务需要的时间差不多,并且不会互相竞争资源,因此我想在上一个任务被处理时下载下一个文件。
这是生产者-消费者问题的变种。
情况类似于读取和处理图像或下载大量文件,但我的下载调用目前还不能使用多进程,而且两个任务所需时间相同。
以下是一个虚拟示例,其中下载和处理都是阻塞的:
这是生产者-消费者问题的变种。
情况类似于读取和处理图像或下载大量文件,但我的下载调用目前还不能使用多进程,而且两个任务所需时间相同。
以下是一个虚拟示例,其中下载和处理都是阻塞的:
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
以更加巧妙的方式, 或者与 deque
结合使用吗?或者必须使用 asyncio
和 Future
?