注意:使用Python 3.5+异步/等待语法
asyncio支持使用中的Executor对象concurrent.futures异步调度任务。事件循环具有run_in_executor()接受Executor对象,aCallable和Callable参数的功能。
安排任务 Executor
import asyncio fromconcurrent.futuresimport ThreadPoolExecutor def func(a, b): # 做时间密集的东西... return a + b async def main(loop): executor = ThreadPoolExecutor() result = await loop.run_in_executor(executor, func, "Hello,", " world!") print(result) if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(main(loop))
每个事件循环还具有Executor可分配给的“默认”插槽Executor。要从Executor循环中分配任务和计划任务,请使用set_default_executor()方法。
import asyncio fromconcurrent.futuresimport ThreadPoolExecutor def func(a, b): # 做时间密集的东西... return a + b async def main(loop): # 注意:使用“无”作为第一个参数指定“默认”执行器。 result = await loop.run_in_executor(None, func, "Hello,", " world!") print(result) if __name__ == "__main__": loop = asyncio.get_event_loop() loop.set_default_executor(ThreadPoolExecutor()) loop.run_until_complete(main(loop))
Executorin有两种主要类型concurrent.futures,ThreadPoolExecutor和和ProcessPoolExecutor。该ThreadPoolExecutor含有可以通过构造或默认为芯在机器倍5.数量来手动设置为线程的特定数量的线程池ThreadPoolExecutor使用线程来执行分配给它的任务的池并且通常是更好在CPU绑定的操作而不是在I / O绑定的操作。与此相对应的是,该ProcessPoolExecutor会为分配给它的每个任务产生一个新进程。在ProcessPoolExecutor只能取任务,是picklable参数。最常见的非可拾取任务是对象的方法。如果您必须将对象的方法安排为中的任务,则Executor必须使用ThreadPoolExecutor。