我正試圖模擬生成下面代碼中所示的數字序列。我想在沒有時間漂移的情況下定期執行,并且沒有記錄呼叫 serial_sequence() 的次數,即沒有使用變數num。 如何做到這一點呢?
在示例代碼中,delay2 始終是 0.1,但它應該略少一些,因為在呼叫 serial_sequence() 之間,事件回圈在其他地方很忙。因此,經過的時間超過了2.0秒。
import asyncio
import time
rx_data = list()
EOT = 20
async def serial_sequence() 。
''模擬傳入的串行資料序列的異步生成器函式''。
num =0
tprev = time.time()
while True:
dt = time.time() - tprev
delay2 = 0.1 - dt #希望避免時間漂移。
print('dt: {}'/span>.format(dt))
print('delay2: {}'/span>.format(delay2))
await asyncio.sleep(delay2) #simulated IO delay。
tprev = time.time()
num =1
yield num
async def read_serial1()。
gen = serial_sequence()
while(True):
data = await gen.__anext__()
rx_data.append(data)
print('read_serial1:'/span>, data)
if data == EOT:
break
return rx_data
async def main():
start = time.time()
task1 = asyncio.create_task(read_serial1())
await(task1)
stop = time.time()
print('Elapsed: {}'/span>.format(stop-start)
if __name__ == '__main__'。
asyncio.run(main())
uj5u.com熱心網友回復:
while回圈中的代碼本身需要一些時間來計算。你的例子中的時間漂移是累積的,因為你把dt建立在前一個時間段的時間上tprev。
你可以使用serial_sequence的絕對起始時間作為參考點,像這樣:
async defserial_sequence():
''模擬傳入的串行資料序列的異步生成器函式''。
num =0
starttime = time.time()
while True:
dt = (time.time() - starttime) % 0.1.
delay2 = 0.1 - dt #希望避免時間漂移。
print('dt: {}'/span>.format(dt))
print('delay2: {}'/span>.format(delay2))
await asyncio.sleep(delay2) #simulated IO delay。
tprev = time.time()
num =1
yield num
通過改變EOT來比較積累。也就是說,將EOT翻倍會導致你的解決方案的時間漂移翻倍,而這個解決方案的時間漂移大約是不變的。
我的答案主要是基于這個非常類似的問題的答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/318025.html
標籤:
