我有实时更新字典的代码。现在,我想创建一个计时器对象,它充当监视器,每隔n秒检查一次字典对象。我怎样才能做到这一点 ?
这是我使用的代码。
def monitor_data():
print data_dict
global data_dict
t = Timer(10.0, monitor_data)
t.start()
答案 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()