Python 3.x 在不中断bot的情况下实现while循环';主事件循环 我正处于两个我的机器人通过ZMQ服务器互相连接的中间,不幸的是,这还需要一个接收器的第二个循环,所以我开始在Web上寻找解决方案,并提出了: 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_消息侦听器,但由于某些原因,该循环仍然会中断主事件循环。这是为什么?虽然Python 3.x 在不中断bot的情况下实现while循环';主事件循环 我正处于两个我的机器人通过ZMQ服务器互相连接的中间,不幸的是,这还需要一个接收器的第二个循环,所以我开始在Web上寻找解决方案,并提出了: 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),python-3.x,python-asyncio,discord.py,Python 3.x,Python Asyncio,Discord.py,基本上,我将interfaceSocket函数作为另一个while循环的任务添加到事件循环中,这样我可以不断检查套接字接收器,同时也可以检查来自discord bot本身的on_消息侦听器,但由于某些原因,该循环仍然会中断主事件循环。这是为什么?虽然接口套接字在技术上是一项任务,但它在while循环中不等待任何东西,并使用阻塞调用,如socket.recv()和time.sleep()。因此,它会在等待事件发生时阻塞整个事件循环 如果socket引用ZMQ套接字,则应使用ZMQ,即使用ZMQ.a
接口套接字
在技术上是一项任务,但它在while
循环中不等待任何东西,并使用阻塞调用,如socket.recv()
和time.sleep()
。因此,它会在等待事件发生时阻塞整个事件循环
如果socket
引用ZMQ套接字,则应使用ZMQ,即使用ZMQ.asyncio.Context
创建ZMQ.asyncio.socket
,而不是。然后,interfaceSocket
可以使用wait
并成为一个行为良好的协同程序:
async def interfaceSocket():
while True:
message = await socket.recv()
await asyncio.sleep(1)
await socket.send(b"World")
我明白你的意思了,虽然这样做有效,但我得到一个类型错误“objectbytes不能用在wait表达式中”不太确定这意味着什么,但它发生在套接字接收上line@Myronaz代码工作的先决条件是
socket
必须是zmq.asyncio.socket
的实例。如果不是这样,你就不能等待。如何获得socket
?我通过context=zmq.context()
获得socket,然后socket=context.socket(zmq.REP)
@Myronaz您应该使用zmq.asyncio.context
,这是“创建异步可兼容套接字的上下文”。请参考问题中的链接。