欢迎光临
我们一直在努力

python 异步实现方法

1 用threading模块启动一个子线程,将要执行的函数放到子线程里

#coding:utf-8
from threading import Thread
from time import sleep

def async(f):
def wrapper(*args, **kwargs):
thr = Thread(target = f, args = args, kwargs = kwargs)
thr.start()
return wrapper

@async
def A():
sleep(20)
print “a function”

def B():
print “b function”

A()
B()
如此,则可实现当A阻塞时,先执行B,再过20秒后执行A

2 继承threading.Thread类

#coding:utf-8
import threading
import time

class Test(threading.Thread):
def __init__(self, value):
threading.Thread.__init__(self)
self.value = value

#继承Thread类需要显示run方法,线程在开启后运行
def run(self):
print(‘start test’)
time.sleep(3) #休息3秒
print(‘input %s’ % self.value)

if __name__ == “__main__”:
test = Test(u’xxx’)
test.start() #开启线程,会自动执行run方法
print(‘end input’)

如上,也会在阻塞的时候直接执行后面的程序

3 使用异步框架 Celery, Tornado, Twisted

4 从py3.4开始使用asyncio实现协程

协程其实也是一种线程,其开销比threading小。而且它是Python3.4引入的新标准库 asyncio。

asyncio的编程模型是一个消息循环。

需要从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行,实现了异步IO。

这个EventLoop相当于线程池。如下测试代码:

#coding:utf-8
import asyncio

@asyncio.coroutine
def test(value):
print(“start test”)

#异步调用asyncio.sleep(3) 休息3秒
r = yield from asyncio.sleep(3)
print(‘input %s’ % value)

loop = asyncio.get_event_loop() #获取EventLoop
c = test(u’xxx’) #获取coroutine

#将coroutine丢进EventLoop中执行
loop.run_until_complete(c)

loop.close()
print(‘end’)

其中,需要使用协程的方法加上coroutine的装饰器。

该协程方法执行像方法一样执行的语句不是直接执行方法,只能获取到一个协程对象。

需要把该对象放到EventLoop中执行。该run_until_complete也可以接收list对象,批量执行协程方法。

看起来代码比多线程复杂?是的,所以到Python3.5引入新的关键字简化协程的代码。

Python3.5引入async/await

为了简化并更好地使用异步,到Python 3.5开始引入了新的语法async和await。

这些关键字可以让coroutine的代码更简洁易读。

1)async相当于@asyncio.coroutine;

2)await相当于yield from。

#coding:utf-8
import asyncio

async def test(value):
print(“start test”)
r = await asyncio.sleep(3)
print(‘input %s’ % value)

loop = asyncio.get_event_loop() #获取EventLoop
c = test(u’xxx’) #获取coroutine

#将coroutine丢进EventLoop中执行
loop.run_until_complete(c)
print(‘end’)

赞(1) 打赏
未经允许不得转载:乌西塔 » python 异步实现方法

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

微信扫一扫打赏