我有一个带有invoke()
方法的Module类,它可以执行一些IO绑定/等待。
我使用sched
以不同的时间间隔运行所述类的多个实例,这种方式可能会使长时间运行的调用与另一个任务重叠。
sched
模块可以产生不同的任务并以非阻塞方式进行处理吗?如果没有,那么哪个模块可以完成多项重复的并发任务?>
我调查了sched
,但找不到任何明确的答案。
我还查看了asyncio
,这向我提示了两个似乎不符合我的需求的答案,分别是while True
(which seems cumbersome)和Tasks (which doesn't appear to allow to run multiple methods concurrently)。
答案 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:驱动主管协程完成;协程的返回值 是此调用的返回值。