【问题标题】:return a value from while loop when using asyncio function使用 asyncio 函数时从 while 循环返回一个值
【发布时间】:2022-01-31 06:49:25
【问题描述】:

我正在尝试同时连接并接收来自多个 websocket 的消息。 为此,我使用 asyncio 制作它,它可以正确打印消息。但问题是我只能打印,不能退货。

我遇到的伪代码的简化示例如下:

import websockets
import json

symbols_id = [1,2]

## LOOP RUNNING EXAMPLE OF ASYNCIO
async def get_connect(symbols_id):
    tasks = []
    for _id in symbols_id:
        print('conncetion to', _id)
        if _id == 1:
            a = 0
        elif _id == 2:
            a = 200
        tasks.append(asyncio.create_task(_loop(a)))

    return tasks

async def _loop(a):
    while True:
        print(a)
        a+=1
        await asyncio.sleep(2.5)

async def ping_func():
    while True:
        print('------ ping')
        await asyncio.sleep(5)


async def main():
    tasks = await get_connect(symbols_id)
    asyncio.create_task(ping_func())
    await asyncio.gather(*tasks)

asyncio.run(main())

从上面的代码可以看出,我在每个循环中使用print(a) 打印a。 我测试了return a 而不是print(a),但它没有帮助。

谢谢

【问题讨论】:

    标签: python async-await python-asyncio


    【解决方案1】:

    yield a? return a 将退出函数和循环,yield 通常是你在 asyncio 中想要的循环任务

    【讨论】:

    • 我尝试了yield,但对如何获得结果感到困惑。我知道哪个async for 是必须与yield 一起使用的东西,但我不知道在哪里。
    【解决方案2】:

    终于找到了使用yieldasync for在每个循环中读取数据的方法。 通过将代码更改为以下代码,它将正常工作。

    import websockets
    import json
    
    symbols_id = [1,2]
    
    global a
    a=0
    
    ## LOOP RUNNING EXAMPLE OF ASYNCIO
    async def get_connect(symbols_id):
        tasks = []
        for _id in symbols_id:
            print('conncetion to', _id)
            if _id == 1:
                a = 0
            elif _id == 2:
                a = 200
            tasks.append(asyncio.create_task(_loop(a)))
    
        return tasks
    
    async def _loop(param):
        global a
        a = param
        while True:
            print(a)
            a+=1
            await asyncio.sleep(2.5)
    
    async def ping_func():
        while True:
            print('------ ping')
            await asyncio.sleep(5)
    
    async def get_result():
        global a
        while True:
            yield a
            await asyncio.sleep(1)
    
    async def main():
        tasks = await get_connect(symbols_id)
        asyncio.create_task(ping_func())
        async for x in get_result():
            print(x)
        await asyncio.gather(*tasks)
    
    asyncio.run(main())
    

    我对如何在另一个代码 sn-p 中使用从这个代码 sn-p 生成的数据感到困惑。我发现的是:

    1- 生成的数据可以通过全局变量访问。

    2- 通过定义一个类和一个属性,可以从代码的每个部分访问它。

    【讨论】:

      猜你喜欢
      • 2013-01-26
      • 2019-09-06
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多