如何在不退出现有循环的情况下安排任务?

时间:2014-02-07 19:59:20

标签: python multithreading cmd scheduled-tasks

我已经在这个问题上挣扎了大约一个星期 - 问一个可以在几分钟内敲响答案的人。

我试图每10秒运行一次python程序。这类问题很多:Use sched module to run at a given timePython threading.timer - repeat function every 'n' secondsHow to execute a function asynchronously every 60 seconds in Python?

通常,使用schedtime.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()

2 个答案:

答案 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()或类似的东西,它可能无法正常工作。