我正在尝试通过 Vkontakte 机器人在 python 上的异步操作来解决这个问题。
我不明白如何使用 asyncio 将 LongPooling 中的事件添加到事件循环中,同时继续轮询服务器:
async def Schedule(self):
await MessageSend()
await asyncio.sleep(10)
await MessageSend()
async def Listen():
for event in Vk.LongPool.listen():
if event.type == VkBotEventType.MESSAGE_NEW:
if event.obj.text == 'Расписание':
task = ioloop.create_task(Schedule())
else:
task = ioloop.create_task(MessageSend())
if __name__ == '__main__':
ioloop = asyncio.get_event_loop()
ioloop.create_task(Listen())
ioloop.run_forever()
ioloop.close()
在这个例子中,函数没有启动,但是如果你通过 await 启动创建的任务,那么所有的事件都会被忽略,直到 Vk.Schedule() 的执行结束。
如何安排所有的事情,使来自循环的事件随着协程的执行继续到达?
从代码来看,您使用的是vk_api?也许切换到异步库会更好?例如aiovk
或者,正如您上面建议的那样,这是将第二个循环移动到单独的线程/进程中。但我认为如果异步的话题已经消失,你应该改变图书馆。
这里的问题在于阻塞
Vk.LongPool.listen()
- 此循环必须在单独的线程中执行或转换为异步。任务在下一次异步调用之后启动,这里是块。