前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python进阶之异步任务

python进阶之异步任务

作者头像
公众号guangcity
发布2019-09-20 15:36:41
4160
发布2019-09-20 15:36:41
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)

0.导语1.yield关键字2.异步加载asyncio第一种方式第二种方式

python进阶之异步任务

0.导语

本文学习视频来自莫凡python,下面是总结的学习内容。 关于星球,我在稍微阐述一点,我用自己的精力在星球中发布小项目,发布日打卡,共同来学习某一块知识,所以改为收费模式,希望通过收费可以筛选出一波真正想学习的人,共同坚持,就像公众号一样,屹立不倒,昨天立了个flag,每日分享一条消息或文字或技术,共同坚持学习!

1.yield关键字

yield类似于return, 但不同之处在于它返回的是生成器!

生成器

  • 生成器是通过一个或多个yield表达式构成的函数。每一个生成器都是一个迭代器(但迭代器不一定是生成器)。
  • 生成器并不会一次返回所有结果,而是每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态。等待下一次的调用。
  • 由于生成器也是一个迭代器,那么它就应该支持next方法来获取下一个值。 除此之外,生成器还支持send函数,该函数可以向生成器传递参数。
代码语言:javascript
复制
# 基本操作
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。

第一种方式

代码语言:javascript
复制
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()

第二种方式

代码语言:javascript
复制
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()
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • python进阶之异步任务
    • 0.导语
      • 1.yield关键字
        • 2.异步加载asyncio
          • 第一种方式
          • 第二种方式
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档