python进阶之异步任务
- 2019 年 10 月 6 日
- 筆記
0.导语1.yield关键字2.异步加载asyncio第一种方式第二种方式
python进阶之异步任务
0.导语
本文学习视频来自莫凡python,下面是总结的学习内容。 关于星球,我在稍微阐述一点,我用自己的精力在星球中发布小项目,发布日打卡,共同来学习某一块知识,所以改为收费模式,希望通过收费可以筛选出一波真正想学习的人,共同坚持,就像公众号一样,屹立不倒,昨天立了个flag,每日分享一条消息或文字或技术,共同坚持学习!
1.yield关键字
yield类似于return, 但不同之处在于它返回的是生成器!
生成器
- 生成器是通过一个或多个yield表达式构成的函数。每一个生成器都是一个迭代器(但迭代器不一定是生成器)。
- 生成器并不会一次返回所有结果,而是每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态。等待下一次的调用。
- 由于生成器也是一个迭代器,那么它就应该支持next方法来获取下一个值。 除此之外,生成器还支持send函数,该函数可以向生成器传递参数。
# 基本操作 def fun(): for i in range(10): yield i f = fun() # 通过for循环+next进行调用 for i in range(10): print(next(f)) print('-----------------------------') def func(): n = 0 while 1: n = yield n f = func() print(next(f)) print('------------------------------') print(f.send(5)) # n赋值为5 def func(number): while True: yield number number += 1 f = func(1) print('------------------------------') # 取出10个数 for i in range(10): print(next(f)) # 生产消费模式 print('------------------------------') def consumer(): r = '' while True: n = yield r if not n: return print('[CONSUMER] Consuming %s...' % n) r = '200 OK' def produce(c): c.send(None) n = 0 while n < 5: n = n + 1 print('[PRODUCER] Producing %s...' % n) r = c.send(n) print('[PRODUCER] Consumer return: %s' % r) c.close() c = consumer() produce(c)
2.异步加载asyncio
asyncioasyncio可以实现单线程并发IO操作 async和await是针对coroutine的新语法,要使用新的语法,只需要做两步简单的替换: 把@asyncio.coroutine替换为async; 把yield from替换为await。
第一种方式
import asyncio @asyncio.coroutine def hello(): print("Hello world!") r = yield from asyncio.sleep(1) print("Hello again!") loop = asyncio.get_event_loop() loop.run_until_complete(hello()) loop.close()
第二种方式
async def hello2(): print('Hello world2!') r = await asyncio.sleep(1) print('Hello again2!') loop = asyncio.get_event_loop() loop.run_until_complete(hello2()) loop.close()