Реализация цикла while без прерывания основного цикла событий бота - PullRequest
0 голосов
/ 16 февраля 2019

Я нахожусь в середине, когда два моих бота взаимодействуют друг с другом через сервер ZMQ, к сожалению, для этого также требуется второй цикл для получателя, поэтому я начал искать в Интернете решения и придумал следующее:

async def interfaceSocket():
    while True:
        message = socket.recv()
        time.sleep(1)
        socket.send(b"World")
    await asyncio.sleep(3)

@client.event
async def on_ready():
    print('logged in as:')
    print(client.user.name)

client.loop.create_task(interfaceSocket())
client.run(TOKEN)

Я в основном добавил функцию interfaceSocket в цикл обработки событий в качестве задачи в качестве другого цикла while, чтобы я мог постоянно проверять приемник сокета, одновременно проверяя прослушиватель on_message от самого бота Discord, но по какой-то причинецикл по-прежнему прерывает основной цикл событий.Почему это?

1 Ответ

0 голосов
/ 16 февраля 2019

Хотя технически задача interfaceSocket, она ничего не ожидает в цикле while и использует блокирующие вызовы, такие как socket.recv() и time.sleep().Из-за этого он блокирует весь цикл событий, ожидая, когда что-то произойдет.

Если socket относится к сокету ZMQ, вам следует использовать асинхронный интерфейс ZMQ , т. Е. Использоватьzmq.asyncio.Context для создания zmq.asyncio.Socket вместо.Тогда interfaceSocket может использовать await и стать хорошим сопрограммой:

async def interfaceSocket():
    while True:
        message = await socket.recv()
        await asyncio.sleep(1)
        await socket.send(b"World")
...