python的sched模块能否在任务执行期间不阻塞地运行异步任务?

2024-10-03 06:28:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

sched模块是否可以派生不同的任务并以非阻塞方式处理它们,如果不是,哪个模块可以为多个重复的并发任务执行任务?你知道吗

我调查了sched,但找不到任何明确的答案。 我还研究了asyncio,这促使我给出了两个似乎不符合我需要的答案,分别是^{} (which seems cumbersome)Tasks (which doesn't appear to allow to run multiple methods concurrently)。你知道吗


Tags: 模块to实例方法答案ioasynciowhich
1条回答
网友
1楼 · 发布于 2024-10-03 06:28:53

学习下面的代码,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修饰 首席信息官协同程序. 这不是强制性的,但非常可取。你知道吗

3:使用收益率异步睡眠(.1)而不仅仅是时间。睡眠(.1),睡觉 不阻塞事件循环。你知道吗

4:如果asyncio.CanceledError错误在旋转醒来后升起,因为 已请求取消,因此退出循环。你知道吗

5:slow\ u函数是一个协程,使用yield from让事件循环 在这个协同程序假装通过睡眠进行I/O时继续。你知道吗

6:收益率异步睡眠(3) 表达式处理到 主循环,它将在睡眠延迟后恢复此协同进程。你知道吗

7:supervisor也是一个协程,所以它可以驱动慢的函数并产生收益 从。你知道吗

第八条:异步.async(…)计划spin协程运行,并将其包装到任务中 对象,该对象将立即返回

9:显示任务对象。输出看起来像Task pending coro=spin() 在旋转器上运行_异步.py:12. 你知道吗

10:驱动slow\u函数()。完成后,获取返回值。 同时,事件循环将继续运行,因为运行缓慢 最终使用异步睡眠(3) 把控制权交回主控台 循环。你知道吗

11:可以取消任务对象;这将引发asyncio.CanceledError错误以收益率 当前暂停协同程序的行。联队可能会赶上 例外和延迟,甚至拒绝取消。你知道吗

12:获取对事件循环的引用。你知道吗

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

相关问题 更多 >