永远在python中运行一个计时器

时间:2014-03-27 00:18:35

标签: python multithreading

我有实时更新字典的代码。现在,我想创建一个计时器对象,它充当监视器,每隔n秒检查一次字典对象。我怎样才能做到这一点 ?

  • 使用sleep不是一个选项,因为它阻止主线程更新字典
  • 我尝试使用Timer,但只运行一次。如何让这个Timer永远运行?

这是我使用的代码。

def monitor_data():
   print data_dict

global data_dict
t = Timer(10.0, monitor_data)
t.start()

2 个答案:

答案 0 :(得分:3)

使用一个或多个CPU绑定线程执行CPython线程效果不佳。

Jython线程很好,IronPython也是如此。 Pypy可能很快就会成为最好的线程,但就目前来说,它并不是很好。

我建议如果你受CPU限制,你可以使用多处理: Python multiprocessing: How do I share a dict among multiple processes?

如果100%的CPython线程受I / O限制且0%受CPU限制,则可以有效地进行线程化。

答案 1 :(得分:2)

你基本上有两种解决方案。一种解决方案可能是使用单独的线程来打印出字典的值。此解决方案可能与使用Timer的尝试解决方案最相似。例如:

import threading
import time

class MonitoringThread(threading.Thread):
    def __init__(self, interval, dict):
        super(MonitoringThread, self).__init__()
        self._continue = True
        self._interval = interval
        self._dict = dict

    def stop(self):
        self._continue = False

    def run(self):
        while self._continue:
            print self._dict
            time.sleep(self._interval)


def main():
    data_dict = {'test': 0}

    t = MonitoringThread(10, data_dict)
    t.start()

    try:
        while True:
            time.sleep(1)   
            data_dict['test'] += 1  # Example update
    except:
        t.stop()

if __name__ == '__main__':
    main()

或者,您也可以尝试构建代码,以便在循环中更新字典,但只检查一次10秒:

import time

def main():
    data_dict = {'test': 0}
    prev_time = time.time()
    while True:
        time.sleep(1)
        data_dict['test'] += 1

        if time.time() - prev_time >= 10:
            print data_dict
            prev_time = time.time()

if __name__ == '__main__':
    main()