Что такое эффективный способ, с помощью которого я могу вызвать некоторую функцию после изменения длины списка на определенную сумму?Как вызвать функцию после выполнения условия
У меня есть вложенный список, в который я добавляю данные 100 раз в секунду, и я хочу вызвать функцию после того, как длина списка увеличится на некоторое значение. Я попытался сделать это с помощью инструкции if
внутри цикла while
(см. Ниже my_loop()
). Это работает, но эта, казалось бы, простая операция занимает 100% от одного из моих ядер процессора. Мне кажется, что постоянный запрос размера списка является лимитирующим фактором скрипта (добавление данных в список в цикле while
не является ресурсоемким).
Вот что я пытался до сих пор:
from threading import Event, Thread
import time
def add_indefinitely(list_, kill_signal):
"""
list_ : list
List to which data is added.
kill_signal : threading.Event
"""
while not kill_signal.is_set():
list_.append([1] * 32)
time.sleep(0.01) # Equivalent to 100 Hz.
def my_loop(buffer_len, kill_signal):
"""
buffer_len: int, float
Size of the data buffer in seconds. Gets converted to n_samples
by multiplying by the sampling frequency (i.e., 100).
kill_signal : threading.Event
"""
buffer_len *= 100
b0 = len(list_)
while not kill_signal.is_set():
if len(list_) - b0 > buffer_len:
b0 = len(list_)
print("Len of list_ is {}".format(b0))
list_ = []
kill_signal = Event()
buffer_len = 2 # Print something every 2 seconds.
data_thread = Thread(target=add_indefinitely, args=(list_, kill_signal))
data_thread.start()
loop_thread = Thread(target=my_loop, args=(buffer_len, kill_signal))
loop_thread.start()
def stop_all():
"""Stop appending to and querying the list.
SO users, call this function to clean up!
"""
kill_signal.set()
data_thread.join()
loop_thread.join()
Пример вывода:
Len of list_ is 202
Len of list_ is 403
Len of list_ is 604
Len of list_ is 805
Len of list_ is 1006
Python многопоточность не не переключает активных потоков до ввода-вывода принимает/место или 'time.sleep()' называется тем, который в данный момент запущен. Это означает, что ваш код тратит большую часть времени на выполнение одного потока или другого. – martineau
Спасибо. Это работало даже тогда, когда я использовал продолжительность сна 1 мс ('time.sleep (0.001)'). – Jakub