python - 如何检查 Asyncio 中的工作人员状态?
问题描述
我正在以作者、标题等身份下载数据。我想一次只下载两本书,所以我为每本书创建一个任务。下载完成后我需要知道。
如果我使用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()
解决方案
我想在工作人员“空闲”后立即将新项目放入队列
您不需要关心工人何时空闲 - 拥有工人的全部意义在于您拥有固定数量的工人(在您的情况下为两个),并且他们尽可能快地排空队列。您不应该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()
推荐阅读
- python - 使用python存储对象列表或表示类属性中对象的字典列表更好吗?
- javascript - Gatsby 网站显示 404 页面用于其他 github 页面 repos
- python-3.x - 用于在 Python 中访问多列的双括号表示法
- apache-flink - 一个flink应用是否只有一个job id
- java - Apache POI - 支持数据透视表切片器
- xslt - XSLT:position() 和 last() 未返回预期结果
- java - 如何在另一个 Activity 中使用来自一个 Activity 的方法?
- node.js - 上传前在 Multer 中验证
- r - 两条不同行中的 GAM 残差 - R“mgcv”
- mysql - 将两个数据集连接到一个查询中