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

Python 每秒运行多个函数,将结果写入文件,python,multithreading,timer,Python,Multithreading,Timer,我试图每秒运行三个函数(每个函数执行起来可能需要1秒)。然后我想存储每个函数的输出,并将它们写入单独的文件 目前,我正在使用计时器s进行延迟处理。(我可以子类化线程,但对于这个简单的脚本来说,这有点复杂) 处理函数_的延迟输出的最佳方法是什么?是否将结果附加到每个函数的全局列表 然后我可以在我的主要功能的末尾放上这样的内容: ... while True: time.sleep(30) # or in a try/except with a loop of 1 second sleeps

我试图每秒运行三个函数(每个函数执行起来可能需要1秒)。然后我想存储每个函数的输出,并将它们写入单独的文件

目前,我正在使用
计时器
s进行延迟处理。(我可以子类化
线程
,但对于这个简单的脚本来说,这有点复杂)

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

然后我可以在我的主要功能的末尾放上这样的内容:

...
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])
想法



编辑:添加了我自己的答案作为可能

我想说存储一个列表列表(
bool
str
),其中
bool
是函数是否已完成运行,而
str
是输出。每个函数都使用一个互斥锁来锁定列表以附加输出(或者如果您不关心线程安全,请忽略此项)。然后,进行一个简单的轮询循环,检查所有
bool
值是否都是
True
,如果是,则执行
save\u-to\u-disk
调用。

我相信python模块正是为这种情况而设计的。您可以这样做,例如:

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))

另一种选择是实现一个类(取自),该类使用
threading.Lock()
。这样做的好处是可以等待
项存储
,并且可以使用
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

+1这是因为输出是分开的文件。如果它是非平凡的,并且涉及到输出的组合,那么您必须等待所有排队的项目完成,然后才能写入。一定要给你得到的物品打电话
task\u done
。好主意!队列是线程安全的,比列表好得多。append(data)我按照darvids0n的建议,将调用添加到
task\u done
。谢谢
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