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凯西,谢谢