Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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 在不中断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

基本上,我将interfaceSocket函数作为另一个while循环的任务添加到事件循环中,这样我可以不断检查套接字接收器,同时也可以检查来自discord bot本身的on_消息侦听器,但由于某些原因,该循环仍然会中断主事件循环。这是为什么?

虽然
接口套接字
在技术上是一项任务,但它在
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
,这是“创建异步可兼容套接字的上下文”。请参考问题中的链接。