我正处于让两个机器人通过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侦听器,但是由于某些原因,该循环仍会中断主循环事件循环。为什么会这样?
答案 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")