每秒运行多个函数,将结果写入文件

时间:2012-01-16 03:32:32

标签: python multithreading timer

我正在尝试每秒运行三个函数(每个函数最多需要1秒执行)。然后我想存储每个函数的输出,并将它们写入单独的文件。

目前我正在使用Timer来处理延迟问题。 (我可以继承Thread,但这对于这个简单的脚本来说有点复杂了)

def main:
    for i in range(3):
        set_up_function(i)
        t = Timer(1, run_function, [i])
        t.start()
    time.sleep(100) # Without this, main thread exits

def run_function(i):
    t = Timer(1, run_function, [i])
    t.start()
    print function_with_delay(i)

处理function_with_delay输出的最佳方法是什么?将结果附加到每个函数的全局列表中?

然后我可以在我的主要功能结束时加上这样的东西:

...
while True:
    time.sleep(30) # or in a try/except with a loop of 1 second sleeps so I can interrupt
    for i in range(3):
        save_to_disk(data[i])

思想?


编辑:添加了我自己的答案

3 个答案:

答案 0 :(得分:7)

我相信python Queue模块正是为这种场景而设计的。你可以做这样的事情,例如:

def main():
    q = Queue.Queue()
    for i in range(3):
        t = threading.Timer(1, run_function, [q, i])
        t.start()

    while True:
        item = q.get()
        save_to_disk(item)
        q.task_done()

def run_function(q, i):
    t = threading.Timer(1, run_function, [q, i])
    t.start()
    q.put(function_with_delay(i))

答案 1 :(得分:1)

我想说存储一个列表列表(boolstr),其中bool是函数是否已经完成运行,str是输出。每个函数都使用互斥锁来锁定列表以附加输出(或者如果您不关心线程安全,则省略此操作)。然后,使用简单的轮询循环检查所有bool值是否为True,如果是,则执行save_to_disk次调用。

答案 2 :(得分:0)

另一种方法是实现使用threading.Lock()的类(取自this answer)。这样做的好处是能够等待ItemStore,而save_to_disk可以使用getAll,而不是轮询队列。 (对大型数据集更有效?)

这特别适合以设定的时间间隔(即每30秒)写入,而不是每秒一次。

class ItemStore(object):
    def __init__(self):
        self.lock = threading.Lock()
        self.items = []

    def add(self, item):
        with self.lock:
            self.items.append(item)

    def getAll(self):
        with self.lock:
            items, self.items = self.items, []
        return items