簡體   English   中英

使用 asyncio function 時從 while 循環返回一個值

[英]return a value from while loop when using asyncio function

我正在嘗試同時連接和接收來自多個 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)但它沒有幫助。

謝謝

yield a return a將退出 function 和循環, yield通常是你在 asyncio 中想要的循環任務

最后我找到了使用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())

我對如何在另一個代碼片段中使用此代碼片段生成的數據感到困惑。 我發現的是:

1- 生成的數據可以通過全局變量訪問。

2- 通過定義 class 和屬性,可以從代碼的每個部分訪問它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM