Python 了解调度程序

Python understanding the 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!"

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

来自the docs

In multi-threaded environments, the scheduler class has limitations with respect to thread-safety, inability to insert a new task before the one currently pending in a running scheduler, and holding up the main thread until the event queue is empty. Instead, the preferred approach is to use the threading.Timer class instead.

from threading import Timer

def x():
    print "Hello"

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

without blocking the main process without using any multithreading or multiprocessing

一个线程不能同时做两件事,所以...threading 是为了不阻塞而需要使用的绝对最小值。

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

from threading import Timer

def xy():
    print("End")

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

最初,Start 将被打印,然后 4 秒后 End 将被打印。

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

from threading import Timer

def xy():
    print("End")

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

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