我已经在这个问题上挣扎了大约一个星期 - 问一个可以在几分钟内敲响答案的人。
我试图每10秒运行一次python程序。这类问题很多:Use sched module to run at a given time,Python threading.timer - repeat function every 'n' seconds,How to execute a function asynchronously every 60 seconds in Python?
通常,使用sched
或time.sleep
的解决方案可以正常运行,但我尝试从cmd2
内开始计划的流程,该流程已在while False
循环中运行。 (退出cmd2
时,退出此循环)。
因此,当我启动一个函数每10秒重复一次时,我进入另一个嵌套在cmd2
内的循环,我无法输入cmd2
命令。我只能通过退出重复该函数的子循环返回cmd2
,因此该函数停止重复。
显然线程会解决这个问题。我试过threading.Timer
没有成功。也许真正的问题是我不了解线程或多处理。
这是一个代码示例,它与我正在使用的代码大致同构,使用sched
模块,我开始工作:
import cmd2
import repeated
class prompt(cmd2.Cmd):
"""this lets you enter commands"""
def default(self, line):
return cmd2.Cmd.default(self, line)
def do_exit(self, line):
return True
def do_repeated(self, line):
repeated.func_1()
其中repeated.py看起来像这样:
import sched
import time
def func_2(sc):
print 'doing stuff'
sc.enter(10, 0, func_2, (sc,))
def func_1():
s = sched.scheduler(time.time, time.sleep)
s.enter(0, 0, func_2, (s,))
s.run()
答案 0 :(得分:2)
http://docs.python.org/2/library/queue.html?highlight=queue#Queue
您可以在cmd2之外实例化Queue对象吗?可以有一个线程监视队列并定期从中获取作业;而cmd2可以自由运行或不运行。当然,处理队列的线程和队列对象本身也需要在外部范围内。
要在特定时间安排某些事情,您可以插入一个具有目标时间的元组。或者你可以让线程定期检查,如果它足够好。
[编辑,如果你有一个打算重复的过程,你可以让它在它结束时重新排队。]
答案 1 :(得分:1)
当我问这个问题时,我能够弄清楚。不知道为什么会发生这种情况。
此代码
def f():
# do something here ...
# call f() again in 60 seconds
threading.Timer(60, f).start()
# start calling f now and every 60 sec thereafter
f()
从这里开始:How to execute a function asynchronously every 60 seconds in Python?
实际上适用于我想要做的事情。在threading.Timer
中如何将函数作为参数调用显然存在一些细微之处。之前,当我在函数之后包含参数甚至括号时,我得到了递归深度错误 - 即。这个功能不断地自我调用。
所以遇到这样问题的其他人,请注意你如何在threading.Timer(60, f).start()
中调用该函数。如果你写threading.Timer(60, f()).start()
或类似的东西,它可能无法正常工作。