当前位置:  开发笔记 > 编程语言 > 正文

内置调度模块的非阻塞scheduler.run()方法的用法?

如何解决《内置调度模块的非阻塞scheduler.run()方法的用法?》经验,为你挑选了0个好方法。

我想了解如何blocking在方法中使用可选参数scheduler.run(blocking=True)。任何实际的/实际的示例都将非常有帮助。

根据我到目前为止所做的研究,blocking可选参数的意图是用于非阻塞或异步应用程序[1] [2]。以下是schduler的主要运行循环(来自python 3.6库sched.py)。在执行该代码之后,我注意到,只要blocking将设置为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')

[1] Python 3.3的新增功能

[2] Issue13449:计划-为run()方法提供“异步”参数

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有