V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
fangwenxue
V2EX  ›  问与答

Python 异步队列问题

  •  
  •   fangwenxue · 2020-05-11 15:48:48 +08:00 · 629 次点击
    这是一个创建于 1648 天前的主题,其中的信息可能已经有所发展或是发生改变。
        async def run_task(self, tasks, task_handler):
            consumer = asyncio.ensure_future(self.consume(self.task_queue))
    
            await self.produce(tasks, task_handler, self.task_queue)
            await self.task_queue.join()
    
            consumer.cancel()
    
        async def produce(self, tasks, task_handler, queue):
            n = len(tasks)
            for i, task in enumerate(tasks):
                item = (i + 1, n, task, task_handler)
                await queue.put(item)
    
        async def consume(self, queue):
            async with ClientSession() as session:
                while 1:
                    item = await queue.get()
                    index = item[0]
                    count = item[1]
                    handler = item[3]
                    rs = await handler(item[2], i=index, n=count, session=session)
                    print('consuming {}/{} {}...'.format(index, count, rs))
                    queue.task_done()
                    # 只要加了这句程序就挂起了
                    await self.produce(rs, self.detail_handler, self.result_queue)
                    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(self.run_task(url_list, self.page_handler))
    loop.close()
    

    打印

    consuming 1/5 ...
    consuming 2/5 ...
    
    • 如果不加这句是正常的
    • 加了这句为什么会挂起
    await self.produce(rs, self.detail_handler, self.result_queue)
    
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5117 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 05:43 · PVG 13:43 · LAX 21:43 · JFK 00:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.