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))