Python异步执行器

示例

注意:使用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。