python协程,周期性执行任务并取消

python coroutine, perform tasks periodically and cancel

For every 10 minutes, do the following tasks.
- generate list of image urls to download
- (if previous download is not finished, we have to cancel the download)
- download images concurrently

我对协程比较陌生.. 我可以用协程构建上面的结构吗?

我认为协程本质上是顺序流.. 所以想起来有问题..

其实自己想想,下面的行不行?

async def generate_urls():

    await sleep(10)
    result = _generate_urls()
    return result

async def download_image(url):

    # download images
    image = await _download_image()
    return image

async def main():

    while True:

        urls = await generate_urls()

        for url in urls:

            download_task = asyncio.create_task(download_image(url))
            await download_task


asyncio.run(main())

您当前的代码非常接近。以下是一些修改,以使其更符合您的原始规范:

import asyncio
def generate_urls():
  return _generate_urls() #no need to sleep in the URL generation function

async def download_image(url):
  image = await _download_image()
  return image

async def main():
   tasks = []
   while True:
      tasks.extend(t:=[asyncio.create_task(download_image(url)) for url in generate_urls()])
      await asyncio.gather(*t) #run downloads concurrently
      await asyncio.sleep(10) #sleep after creating tasks
      for i in d: #after 10 seconds, check if any of the downloads are still running
        if not i.done():
            i.cancel() #cancel if task is not complete