Python 如何在Asyncio中检查工作进程状态?

Python 如何在Asyncio中检查工作进程状态?,python,return,python-asyncio,coroutine,worker,Python,Return,Python Asyncio,Coroutine,Worker,我正在下载作者、标题等数据。我只想一次下载两本书,所以我为每本书创建一个任务。下载完成后,我需要知道 如果我使用queue.join()我将知道任务何时完成,但我必须等待这两个任务,相反,我希望在工作人员“空闲”时立即将新项目放入队列 我如何知道员工何时可以获得新项目 下面,您可以找到一些代码来解释我试图做的事情: nTasks = 2 async def worker(name): while True: #Wait for new book item

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

如果我使用
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()
nTasks=2
异步def工作程序(名称):
尽管如此:
#等待新书
队列\项=等待队列\获取()
#开始下载作者、标题等。。。
loop=asyncio.get\u event\u loop()
任务=循环。创建任务(下载书籍(队列项目、文件))
队列任务完成()
异步def main():
尝试:
#我们一次创建两个任务
计数=0
而(计数
我想在员工“空闲”后立即将新项目放入队列

你不必在意一个工人什么时候有空——拥有工人的关键是你有固定数量的工人(在你的情况下是两个),他们尽可能快地排干队列。您不应该在工作进程内使用
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()

您好,这里:
wait queue\uu.put(mediaGet)
您的意思是
wait queue.put(mediaGet)
?没有下划线char@Francesco是的,你原来的名字还有多余的部分
queue.join()
等待两个任务完成。但是,例如,如果第一个任务在第二个任务之前完成,脚本将把第三个可用项放在队列中(代替第一个),或者它将等待第一个和第二个任务?谢谢lot@Francesco你的问题把我弄糊涂了。等待
queue.join()
时,队列包含所有任务,因此脚本不会“放入”队列中的第三项,它将从一开始就存在。这两名工作人员将尽可能快地将项目从队列中排出,而无需等待上一个任务以外的任何其他任务完成。这将确保在任何时候都有两个任务被处理(除了在最后一个任务被处理的最后一个任务,并且仍然是唯一的一个任务)。已解决。神奇用户4815162342Thanks@Jack凯西,谢谢