python的sched模块可​​以运行异步任务而不在任务执行期间阻塞吗?

时间:2019-07-09 10:37:03

标签: python asynchronous scheduled-tasks

我有一个带有invoke()方法的Module类,它可以执行一些IO绑定/等待。

我使用sched以不同的时间间隔运行所述类的多个实例,这种方式可能会使长时间运行的调用与另一个任务重叠。

sched模块可以产生不同的任务并以非阻塞方式进行处理吗?如果没有,那么哪个模块可以完成多项重复的并发任务?

我调查了sched,但找不到任何明确的答案。 我还查看了asyncio,这向我提示了两个似乎不符合我的需求的答案,分别是while True (which seems cumbersome)Tasks (which doesn't appear to allow to run multiple methods concurrently)

1 个答案:

答案 0 :(得分:0)

研究以下代码,Luciano Ramalho的Fluent Python第18章是有关asyncio模块的绝佳资源。另外,永远不要忘记https://docs.python.org/3/library/asyncio.html

上的文档本身
#!/usr/bin/env python3

# spinner_asyncio.py

# credits: Example by Luciano Ramalho inspired by
# Michele Simionato's multiprocessing example in the python-list:
# https://mail.python.org/pipermail/python-list/2009-February/538048.html

import asyncio
import itertools
import sys


@asyncio.coroutine  # <1>
def spin(msg):  
    write, flush = sys.stdout.write, sys.stdout.flush
    for char in itertools.cycle('|/-\\'):
        status = char + ' ' + msg
        write(status)
        flush()
        write('\x08' * len(status))
        try:
            yield from asyncio.sleep(.1)  # <3>
        except asyncio.CancelledError:  # <4>
            break
    write(' ' * len(status) + '\x08' * len(status))


@asyncio.coroutine
def slow_function():  # <5>
    # pretend waiting a long time for I/O, Non-blocking call!
    yield from asyncio.sleep(3)  # <6>
    return 42


@asyncio.coroutine
def supervisor():  # <7>
    spinner = asyncio.async(spin('thinking!'))  # <8>
    print('spinner object:', spinner)  # <9>
    result = yield from slow_function()  # <10>
    spinner.cancel()  # <11>
    return result


def main():
    loop = asyncio.get_event_loop()  # <12>
    result = loop.run_until_complete(supervisor())  # <13>
    loop.close()
    print('Answer:', result)


if __name__ == '__main__':
    main()

1:打算与asyncio一起使用的协程应使用@asyn装饰 cio。协程。这不是强制性的,但强烈建议。

3:使用asyncio.sleep(.1)的收益而不是time.sleep(.1)进行睡眠 不会阻塞事件循环。

4:如果在旋转唤醒后引发asyncio.CancelledError,这是因为 请求取消,请退出循环。

5:slow_function是协程,并使用yield from使事件循环 在协程假装通过睡眠进行I / O时继续操作。

6:asyncio.sleep(3)表达式的产量处理流向 主循环,它将在睡眠延迟后恢复协程。

7:主管同时也是协程,因此它可以提高yield的slow_function 来自。

8:asyncio.async(…)计划运行自旋协程,并将其包装在Task中 对象,该对象将立即返回

9:显示任务对象。输出看起来像任务待定coro = spin() 运行在spinner_asyncio.py:12。

10:驱动slow_function()。完成后,获取返回值。 同时,由于slow_function,事件循环将继续运行 最终使用asyncio.sleep(3)的yield将控制权交还给main 循环。

11:可以取消任务对象;这会产生asyncio.CancelledError 协程当前暂停的行。协程可能会抓住 例外,延误甚至拒绝取消。

12:获取对事件循环的引用。

13:驱动主管协程完成;协程的返回值 是此调用的返回值。