专栏首页光城(guangcity)python进阶之异步任务

python进阶之异步任务

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

本文分享自微信公众号 - 光城(guangcity),作者:lightcity

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 论文复现之医学图像应用:视网膜血管分割

    今日研究为继续上次论文中的一个内容:U-Net网络,于是找了一篇经典论文,并学习论文及代码解读。在学习U-Net网络后,使用U-Net神经网络提取视网膜纹理血管...

    公众号guangcity
  • 多种解法破解链表

    我们算法已经到了leetcode攀登之旅(21)!本周还差一次刷题推送,这篇就是,没错,让各位久等了,这次放的可是多种解法干货!!!

    公众号guangcity
  • Python基础长文

    最近发的一些都是python的一些实际应用篇,今天落地,从基础出发,将我的python自学之路:本年4月开始学python的基础笔记,分享给各位,本文字数跟阅读...

    公众号guangcity
  • 实战生成对抗网络[3]:DCGAN

    在上一篇文章《实战生成对抗网络[2]:生成手写数字》中,我们使用了简单的神经网络来生成手写数字,可以看出手写数字字形,但不够完美,生成的手写数字有些毛糙,边缘不...

    云水木石
  • 什么是程序化广告

    程序化广告是指广告主通过数字平台从受众的匹配的角度由程序自动化完成展示类广告的采买和投放,并实时反馈投放分析的一种广告投放方式,实现了整个数字广告的自动化。

    GA小站
  • 127个常用的JS代码片段,每段代码花30秒就能看懂(一)

    JavaScript 是目前最流行的编程语言之一,正如大多数人所说:“如果你想学一门编程语言,请学JavaScript。”

    前端达人
  • <算法>图解逆序单向链表全过程

    4个桶, 桶上都分别标着特定的标签1, 2, 3, 4; 桶里有对应的4个球,标着和桶一样的编号; 问题来了, 让所有桶和桶内球的编号之和都为5, 在交换的...

    zhaoolee
  • 简单粗暴直接,洗脑广告为何越骂越火?

    “有趣却毫无销售力的广告,只是在原地踏步;但是有销售力却无趣的广告,却令人憎恶。”

    罗超频道
  • Jupyter-Notebook 远程访

    记得当时在说设置默认工作路径的时候,提过配置文件https://www.cnblogs.com/dotnetcrazy/p/9261524.html

    用户2398817
  • 大数据项目的思考

    最近做了一个大数据可视化的项目,目前阶段还仅仅对我们关心的指标做一些年度,季度,月度维度的汇总和展示,提供了简单的纵向横向的指标对比。 结合离线全量数据和实时流...

    春哥大魔王

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动