Python了解调度程序

时间:2015-02-27 04:37:20

标签: python scheduled-tasks scheduler

我有一个python scheduler代码可以打印HelloWorld!

import sched
import time

def x():
    print "Hello"

s = sched.scheduler(time.time, time.sleep)
s.enter(10, 1, x, ())
s.run()
print "World!"

等待10 seconds并输出:

Hello
World!

我认为调度程序的工作是在不中断当前进程的情况下安排任务。但是这里它将整个程序置于睡眠状态,其行为与下面的代码相似:

import time

def x():
    print "Hello"

time.sleep(10)
x()
print "World!"

我想调度程序会因time.sleep中的sched.scheduler(time.time, time.sleep)参数而让程序进入休眠状态。 无论如何,我们可以让它像实时调度程序一样工作而不会阻止主进程而不使用任何multithreadingmultiprocessing

2 个答案:

答案 0 :(得分:1)

来自the docs

  

在多线程环境中,scheduler类在线程安全方面存在限制,无法在正在运行的调度程序中当前挂起的任务之前插入新任务,并且在事件发生之前保持主线程队列是空的。相反,首选方法是使用threading.Timer类。

from threading import Timer

def x():
    print "Hello"

Timer(10, x, ()).start()
print "World!"
  

不使用任何multithreadingmultiprocessing

而不阻止主要流程

单个线程无法同时执行两项操作,因此...... threading是您需要使用的绝对最小值,以便不阻止。

答案 1 :(得分:0)

调度器的工作不仅仅是在每个特定时间段之后执行后续任务。它的工作也是锁定对象,直到它完成任务。

from threading import Timer

def xy():
    print("End")

Timer(4, xy, ()).start()
print ("Start")

最初,将打印开始,然后在 4 秒后打印结束

如果我们有一个无限循环怎么办

from threading import Timer

def xy():
    print("End")

Timer(4, xy, ()).start()
print("Start")
i = 0
while i < 10:
    print(i)

它将持续运行。因此,证明它会保持线程直到前一个线程完成它的任务。