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

问题描述 投票:1回答:1

我正在通过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循环的任务,所以我可以不断地检查套接字接收器,同时还检查来自discord bot本身的on_message监听器,但由于某种原因,循环仍然会中断主事件循环。为什么是这样?

python-3.x python-asyncio discord.py
1个回答
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")
© www.soinside.com 2019 - 2024. All rights reserved.