【问题标题】:How to check worker status in Asyncio?如何检查 Asyncio 中的工作人员状态?
【发布时间】:2021-02-07 17:29:38
【问题描述】:

我正在以作者、标题等身份下载数据。我想一次只下载两本书,所以我为每本书创建一个任务。下载完成后我需要知道。

如果我使用queue.join(),我会知道任务何时完成,但我必须等待这两个任务,相反,我想在工作人员“空闲”后立即将新项目放入队列。

我如何知道工作人员何时可以获取新物品?

在下面,您可以找到一些代码来解释我正在尝试做的事情:

nTasks = 2
async def worker(name):
    while True:
        #Wait for new book item
        queue_item = await queue_.get()
    
        #Starts to download author, title etc...
        loop = asyncio.get_event_loop()
        task = loop.create_task(download_books(queue_item, file))

    queue_.task_done()

async def main():
try:
                #We create 2 task at once
                count = 0
                while ( count < nTasks):
                        #Gets the book file name
                        mediaGet = ....
                        #Put on queue
                        await queue_.put(mediaGet)                    
                        #Next download
                        count = count + 1
                contaTask = 0        
                
                #Wait until tasks are finished
                await queue_.join()

【问题讨论】:

  • @Jack Casey 谢谢

标签: python return python-asyncio coroutine worker


【解决方案1】:

我想在工作人员“空闲”后立即将新项目放入队列

您不需要关心工人何时空闲 - 拥有工人的全部意义在于您拥有固定数量的工人(在您的情况下为两个),并且他们尽可能快地排空队列。您不应该在工作人员内部使用create_task(),因为那样您会在后台生成任务并放弃工作人员限制。

使用队列的正确方法如下所示:

async def worker(queue):
    while True:
        queue_item = await queue.get()
        await download_books(queue_item, file)
        queue.task_done()

async def main():
    queue = asyncio.Queue()
    # create two workers
    workers = [asyncio.create_task(worker(queue)) for _ in 2]
    # populate the queue
    for media in ...:
        await queue.put(media)
    # wait for the workers to do their jobs
    await queue.join()
    # cancel the now-idle workers
    for w in workers:
        w.cancel()

【讨论】:

  • 嗨,这里:await queue_.put(mediaGet) 你的意思是await queue.put(mediaGet)?没有下划线字符
  • @Francesco 是的,额外的 _ 保留在您原来的命名中。
  • 另一个问题; queue.join() 等到两个任务都完成。但是,例如,如果第一个任务在第二个任务之前完成,脚本会将第三个可用的项目放在队列中(代替第一个),或者它将等待第一个和第二个任务?非常感谢
  • @Francesco 我对你的问题感到困惑。当等待queue.join() 时,队列包含所有 个任务,因此脚本不会将第三个项目“放入”队列中,它会从一开始就在那里。这两个工作人员将尽可能快地将项目从队列中取出,而无需等待除前一个任务之外的任何其他任务完成。这将确保在任何时候都在处理两个任务(除了最后一个任务,当最后一个任务正在处理时,并且仍然是唯一一个)。
  • 已解决。很棒的用户4815162342谢谢
猜你喜欢
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多