我想了解如何在方法
scheduler.run(blocking=True)中使用可选参数阻塞.任何实际/现实世界的例子都会非常有用.
根据我迄今为止所做的研究,阻塞可选参数的意图是非阻塞或异步应用程序[1] [2].下面是schduler的主要运行循环(来自python 3.6库sched.py).通过代码,我注意到每当阻塞设置为False时,立即返回目标时间和当前时间之间的时间差,除非目标时间已经过去,在这种情况下将执行操作.
while True:
with lock:
if not q:
break
time, priority, action, argument, kwargs = q[0]
now = timefunc()
if time > now:
delay = True
else:
delay = False
pop(q)
if delay:
if not blocking:
return time - now
delayfunc(time - now)
else:
action(*argument, **kwargs)
delayfunc(0) # Let other threads run
在我看来,非阻塞设计要求我继续运行调度程序,直到队列清理为止.因此,我正在考虑自己维护一个任务队列,并继续将scheduler.run任务推入队列(如下面的代码.)这是一个理想的设计吗?使用非阻塞调度程序的正确方法是什么?
def action():
print('action at: ', datetime.now())
if __name__ == '__main__':
s = sched.scheduler(time.time)
target_time = datetime.now() + timedelta(seconds=5)
s.enterabs(target_time.timestamp(), 1, action)
run = functools.partial(s.run, blocking=False)
taskq = deque()
taskq.append(run)
while taskq:
task = taskq.popleft()
result = task()
print(result)
if result:
taskq.append(run)
time.sleep(1)
print('end tasks')