我正在通过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监听器,但由于某种原因,循环仍然会中断主事件循环。为什么是这样?
虽然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")