asynchronous - 如何像生成器一样使用异步协程?

标签 asynchronous websocket python-3.6 python-asyncio

我想用Python开发一个网络套接字观察器,当我发送某物时,它应该等到收到响应(有点像阻塞套接字编程)我知道这很奇怪,基本上我想做一个命令行 python 3.6 工具,可以与服务器通信,同时为来自用户的所有命令保持相同的连接。

我可以看到下面的代码片段非常典型地使用 python 3.6。

import asyncio
import websockets
import json
import traceback

async def call_api(msg):
   async with websockets.connect('wss://echo.websocket.org') as websocket:
       await websocket.send(msg)
       while websocket.open:
           response = await websocket.recv()
           return (response)

print(asyncio.get_event_loop().run_until_complete(call_api("test 1")))

print(asyncio.get_event_loop().run_until_complete(call_api("test 2")))

但这将为每个命令创建一个新的 ws 连接,从而达不到目的。有人可能会说,您必须使用异步处理程序,但我不知道如何将 ws 响应与命令提示符下的用户输入同步。

我在想,如果我能让异步协程(call_api)像生成器一样工作,它有yield语句而不是return,那么我可能可以做如下的事情:


async def call_api(msg):
   async with websockets.connect('wss://echo.websocket.org') as websocket:
       await websocket.send(msg)
       while websocket.open:
           response = await websocket.recv()
           msg = yield (response)

generator = call_api("cmd1")

cmd  = input(">>>")

while cmd != 'exit'
    result = next(generator.send(cmd))
    print(result)
    cmd  = input(">>>")


请告诉我您的宝贵意见。

谢谢

最佳答案

这可以使用 asynchronous generator (PEP 525) 来实现.

这是一个工作示例:

import random
import asyncio


async def accumulate(x=0):
    while True:
        x += yield x
        await asyncio.sleep(1)


async def main():
    # Initialize
    agen = accumulate()
    await agen.asend(None)
    # Accumulate random values
    while True:
        value = random.randrange(5)
        print(await agen.asend(value))


asyncio.run(main())

关于asynchronous - 如何像生成器一样使用异步协程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56577662/

相关文章:

python - 通过 Bloomberg 的新数据 API (COM v3) 与 Python 的异步数据?

javascript - 带有嵌套 For 循环的进度条

javascript - 使用 Chrome 应用 API 获取文件

php - 如何使用 PHP 设置 WebSocket 安全连接?

javascript - 无法与 Amber 或 NPM 建立 websocket 连接,不确定是哪一个

python - 通过 websocket 问题进行币安流交易

python - 使用 beautifulsoup 通过 div 标签查找 div 文本

javascript - 结合 async.each 和 async.series

python - 在 python 中以递归方式对文件进行 glob 的干净方法

python - VS Code 在 MacOS 上未检测到 Python3 解释器