Я хотел бы запустить сценарий Python, который может имитировать данные временных рядов реального мира и обрабатывать данные в реальном времени. То есть из заданного набора данных (который составляет ~ 8 часов измерения) я хочу получать данные длиной в одну секунду каждую секунду и обрабатывать, как только каждая секунда данных будет прочитана. В реальном мире данные будут собираться каждую секунду с помощью некоторых детекторов. Для этой задачи я решил использовать модуль Python asyncio
. Вот в основном то, что я придумал.
import scipy
import numpy as np
import asyncio
import time
import queue
q = queue.Queue()
async def get_data (data):
while True:
await asyncio.sleep(1)
q.put(data[idx,:])
idx += 1
#Each row of data is read every second.
async def run_algorithm ():
while True:
if q.empty() == True:
await asyncio.sleep(1)
data_read = q.get(block = False)
#I do something here with the read data
async def main (data):
feed_data = asyncio.create_task(get_data(data))
process_data = asyncio.create_task(run_algorithm ())
await asyncio.gather(feed_data, process_data)
Хотя кажется, что все работает нормально, проблема в том, что # Я что-то делаю здесь с частью чтения данных. Вот где я использую свой алгоритм для обработки данных в реальном времени. Когда я использую быстрый алгоритм, он работает очень хорошо. Он считывает данные каждую секунду, как и должно, и функция run_algorithm ждет секунду, если в очереди нет данных.
Однако, когда у меня медленный алгоритм, он не считывает данные каждую секунду . Если для выполнения алгоритма требуется 0,5 секунды, то следующие данные будут считаны через 1,5 секунды вместо 1 секунды.
Это похоже на то, что функция get_data замедляется по мере замедления части run_algorithm. Есть ли способ заставить get_data читать данные каждую секунду независимо от того, сколько времени занимает часть run_algorithm?