一旦满足条件,如何触发功能

时间:2016-12-02 22:33:55

标签: python multithreading

一旦列表长度变化一定量,我可以触发某些功能的有效方法是什么?

我有一个嵌套列表,我每秒100次添加数据,并且我想在列表长度增加一些值后触发一个函数。我尝试在if循环中使用while语句执行此操作(请参阅下面的my_loop())。这可行,但这个看似简单的操作占用了我的一个CPU内核的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

0 个答案:

没有答案