繁体   English   中英

如何从异步循环中获取返回值?

[英]How to get the returned value from asyncio loop?

我正在尝试测量 rtl sdr dongle 捕获的信号的功率水平,然后比较几个测量值以获得最佳功率水平,但我不知道如何立即将功率水平返回到我的主要功能。

这是我的代码:

import asyncio
from rtlsdr import RtlSdr
import numpy as np
import time

global power

async def streaming():
    #SDR CONFIGURATION
    sdr = RtlSdr()
    sdr.rs = 2.4e6
    sdr.fc = 801e6

    async for samples in sdr.stream(512):
        global power
        samples = samples - np.mean(samples)
        calibrate = 3.2
        power = np.mean(np.abs(samples ** 2))

        #print('Relative power:', calibrate * 10 * np.log10(power), 'dB')
    await sdr.stop()
    sdr.close()
    #return power
# i traied this function to return the result from streaming() but it didn't work !!
async def get_result():
    global power
    while True:
        yield power

async def main():
    global power
    nb_config = 100
    fpower = -100
    for i in range(nb_config):
        # Get the current event loop.
        loop = asyncio.get_running_loop()
        #try to get the power value from the loop
        task = streaming()
        power = loop.run_until_complete(asyncio.gather(*task))
        loop.close()
        if power > fpower :
            fpower = power
            print(10*np.log10(fpower))

asyncio.run(main(), debug=True)

简短的回答是,如果您希望异步函数产生多个值,只需产生它们:

async def powers(): # was 'streaming', but that doesn't seem to describe it
    ...

    async for samples in sdr.stream(512):
        samples = samples - np.mean(samples)
        calibrate = 3.2
        power = np.mean(np.abs(samples ** 2))
        yield power

    await sdr.stop()
    sdr.close()

但是你需要在main中获取这些值:

async def main():
    ...
    async for power in powers():
        print(power)

由于这是协作多线程,任何时候 python 在main() (或其他任何东西)中,它都不会在powers()中。 这是否重要取决于相关工具的构建方式,但如果您的 SDR 仍在输出数据,您可能需要注意不要在代码变长时填满缓冲区。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM