Python 异步队列问题

发布于 2022-09-12 02:39:17 字数 1364 浏览 17 评论 0

    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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文