Python中的实时中断
我有一个在无限循环中运行的Python 2.7程序,我想加一个定时器中断。我的目标是在循环的某个时刻启动一个定时器,当5秒钟过去后,我希望代码能跳转到循环的特定部分。
到目前为止,我的做法是这样的:在每次循环中,我会检查到达代码某个点时已经过去了多少时间,使用
time.clock()
如果时间差超过5秒,我就执行我想要运行的那段代码。
但是这样的话,可能会有7秒才会检查一次时间,那时虽然已经超过5秒,但我希望在正好5秒时就能跳过去。
另外,我还需要这个功能可以支持多个计数器(可能多达100个),但我不希望这些中断互相干扰。使用定时器也没有奏效。
我知道在汇编语言中可以使用定时器中断,但我该如何在Python中实现呢?
2 个回答
0
要实现实时功能,你需要特别的硬件或软件支持。其实在大多数情况下,你并不需要这种功能(你真的需要控制巨型机器人吗?)。
如果你想让几个函数调用之间延迟几秒,这要根据你的需求来决定。例如,如果一个函数运行的时间和调用之间的延迟相比可以忽略不计,那么你可以选择在一个线程中运行所有函数:
#!/usr/bin/env python
from __future__ import print_function
from Tkinter import Tk
root = Tk()
root.withdraw() # don't show the GUI window
root.after(1000, print, 'foo') # print foo in a second
root.after(0, print, 'bar') # print bar in a jiffy
root.after(2000, root.destroy) # exit mainloop in 2 seconds
root.mainloop()
print("done")
这样做可以满足你的想法:"我不想让中断互相干扰",因为下一个回调函数只有在前一个完成后才会被调用。
8
如果只需要处理一个事件,最简单的方法就是使用 signal
框架,这是 Python 的一个标准模块。
但是,如果我们需要一个功能齐全的调度器,就得使用另一个模块: sched
。你可以在 这里找到官方文档。不过要注意,在多线程环境下, sched
在线程安全方面有一些限制。
还有一个选择是 高级 Python 调度器,这个不是标准库的一部分。