python面试之异步编程

WHAT

以进程、线程、协程、函数/方法作为执行任务程序的基本单位,结合回调、事件循环、信号量等机制,以提高程序整体执行效率和并发能力的编程方式。

解决方案

通过协程

WHY

在一个线程中,如果遇到IO等待,利用该空闲时间,再去干点其他的事。

WHAT

并不是计算机系统提供(进程,线程),而是程序员人为创造的。
用户态内的上下文切换技术。
简而言之,就是通过一个线程实现代码之间的相互切换。

HOW

方法1. 通过第三方模块,如:gevent
方法2. 通过关键字yield

def func():
    yield 1
    yield from func2()
    yield 2


def func2():
    yield 3
    yield 4


f1 = func()
for item in f1:
    print(item)

方法3. 通过python标准库,如:asyncio (py3.4)
遇到IO阻塞,可自动切换

import asyncio


@asyncio.coroutine
def func1():
    print(1)
    yield from asyncio.sleep(2)  # 遇到IO耗时操作时(需要2秒),自动切换到task中的其他任务
    print(2)


@asyncio.coroutine
def func2():
    print(3)
    yield from asyncio.sleep(1)  # 遇到IO耗时操作时(需要1秒),自动切换到task中的其他任务
    print(4)


tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2()),
]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

方法4. 通过关键字:async,await (py3.5)【推荐】
跟方法3工作的原理一致,只是方便了写法

import asyncio


async def func1():
    print(1)
    await asyncio.sleep(2)  # 遇到IO耗时操作时(需要2秒),自动切换到task中的其他任务
    print(2)


async def func2():
    print(3)
    await asyncio.sleep(1)  # 遇到IO耗时操作时(需要1秒),自动切换到task中的其他任务
    print(4)


tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2()),
]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容