Создайте асинхронную очередь Python на основе двух динамических запросов Django ORM

Мне нужно делать предложения агентам в чате. Оба предложения берутся из Django ORM динамически, у агентов есть ограничения на максимальное количество активных чатов. У одного агента должно быть одно предложение одновременно. Чат должен предлагаться разным агентам последовательно. Вот пример попытки, показывающий ожидаемую логику, но он предлагает только один чат в одно время.

async def offerer():
    while True:
        await asyncio.sleep(0.1)
        async for chat in Chat.objects.filter(Q(status = 'initiated') | Q(status = 'queued')).order_by('last_init')[:5]:
            chatid = chat.chatid
            dobreak = False
            account = chat.chatacc_id
            async for agent in Agent.objects.filter(status = 'ready', accounts = account, number_active__lt = maxchats).order_by('number_active'):
                data = {"type": "chat_initiated", "chatid": chat.chatid}
                await channel_layer.group_send(f'agent_{agent.agentid}', data)
                await asyncio.sleep(5)

                # check if chat was accepted
                chat_updated = await Chat.objects.aget(chatid = chatid)
                if 'active' in chat_updated.status:
                    dobreak = True
                    break
                else:
                    await channel_layer.group_send(f'agent_{agent.agentid}', {"type": "cancel", "value": chat.chatid})
            if dobreak:
                break

async def main():
    asyncio.create_task(offerer())

loop = asyncio.new_event_loop()
loop.create_task(main())
loop.run_forever() 

Как правильно это сделать?

Вернуться на верх