![](/img/trans.png)
[英]Python asyncio gather returned value from 'call_soon_threadsafe'
[英]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.