Python 了解调度程序
Python understanding the scheduler
我有一个 python scheduler
代码来打印 Hello
和 World!
。
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
参数而使程序进入休眠状态。
无论如何我们可以让它像实时调度程序一样工作而不阻塞主进程而不使用任何 multithreading
或 multiprocessing
?
来自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)
会一直运行。因此,证明它会保持线程直到前一个完成它的任务。
我有一个 python scheduler
代码来打印 Hello
和 World!
。
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
参数而使程序进入休眠状态。
无论如何我们可以让它像实时调度程序一样工作而不阻塞主进程而不使用任何 multithreading
或 multiprocessing
?
来自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 thethreading.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
ormultiprocessing
一个线程不能同时做两件事,所以...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)
会一直运行。因此,证明它会保持线程直到前一个完成它的任务。