异步循环消费主函数

可用于消费任务场景,单线程异步并发处理任务,最大性能比消费

主调度函数如下

async def run(self):
    """异步主循环处理任务

    持续从队列获取任务并处理,通过信号量控制并发数,
    无需等待当前批次任务全部完成即可处理新任务

    self.process_task 为单个任务处理函数
    self.semaphore_num 为最大并发处理数
    self.baseinfo.task_queue 为取任务类(此处使用redis)
    """
    async with aiohttp.ClientSession() as session:
        # 异步请求session(可选)
        self.session = session
        # 用于追踪正在执行的任务
        running_tasks = set()

        while True:
            if running_tasks:
                await asyncio.wait(
                    running_tasks, return_when=asyncio.FIRST_COMPLETED, timeout=2,
                )

            elif self.baseinfo.task_queue.num_of_tasks() == 0:
                # 队列无任务
                await asyncio.sleep(0.2)

            # 清理已完成的任务
            running_tasks = {task for task in running_tasks if not task.done()}
            # 当前正在执行的任务数量低于最大并发数时,尝试添加新任务
            empty_slots = self.semaphore_num - len(running_tasks)

            if empty_slots == 0:
                # task队列必不为空
                continue

            tasks = self.baseinfo.task_queue.fetch_tasks(empty_slots)
            for company_id, score in tasks:
                # self.process_task 为单个任务处理函数
                task = asyncio.create_task(self.process_task(company_id))
                running_tasks.add(task)

其余函数正常使用async即可,无需限制并发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值