实现while循环而不会中断bot的主事件循环

时间:2019-02-16 19:01:30

标签: python-3.x python-asyncio discord.py

我正处于让两个机器人通过ZMQ服务器相互对接的过程中,不幸的是,这也需要接收者进行第二次循环,因此我开始在网上寻找解决方案并提出了以下解决方案: / p>

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循环的任务,因此我可以不断检查套接字接收器,同时还可以从discord bot本身检查on_message侦听器,但是由于某些原因,该循环仍会中断主循环事件循环。为什么会这样?

1 个答案:

答案 0 :(得分:2)

尽管interfaceSocket从技术上来说是一项任务,但它不会等待while循环中的任何内容,而是使用诸如socket.recv()time.sleep()之类的阻塞调用。因此,它在等待某些事件发生时会阻塞整个事件循环。

如果socket指的是ZMQ套接字,则应该使用ZMQ asyncio interface,即使用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")