[英]Python: why use AsyncIO if not with asyncio.gather()?
[英]Use asyncio with neovim remote plugins
我想写一个 vim 插件来监听服务器发送的事件。 由于我最熟悉 python3 并使用 neovim,我认为使用neovim 远程插件 API是一个好主意。
显然,监听来自网络的消息不能是阻塞的,因此必须以某种方式涉及 asyncio。 但我无法弄清楚如何将两者结合起来。 我必须在某个地方运行事件循环。 但是,pynvim 已经运行了自己的事件循环,所以我可能应该加入它。
@pynvim.plugin
class MyPlugin:
def __init__(self, nvim):
self.nvim = nvim
@pynvim.command('Connect', nargs='1')
async def connect(self, args):
url = base_url + args[0]
async with sse_client.EventSource(url) as event_source:
for raw in event_source:
try:
msg = json.loads(raw)
except json.JSONDecodeError:
continue
do_something(msg)
这个例子不起作用。 Connect
命令在 neovim 中不可用(在我使它异步之前)。
不确定这是否是最好的答案,但这是我发现的工作:
asyncio
似乎保留了对当前循环的引用,因此asyncio.ensure_future()
可用于调度异步代码。 但是,如果该异步代码尝试访问 vim 内部,它将崩溃。 为此,您需要使用nvim.async_call()
调用另一个回调。
@pynvim.plugin
class MyPlugin:
def __init__(self, nvim):
self.nvim = nvim
async def _connect(self, url):
async with sse_client.EventSource(url) as event_source:
for raw in event_source:
try:
msg = json.loads(raw)
except json.JSONDecodeError:
continue
self.nvim.async_call(do_something, msg)
@pynvim.command('Connect', nargs='1')
def connect(self, args):
url = base_url + args[0]
asyncio.ensure_future(self._connect(url))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.