专栏首页大猪的笔记python:python中异步的使用姿势

python:python中异步的使用姿势

async

在python中,可以利用asyncio包异步处理IO等操作,极大的增加吞吐。 asyncio的底层依赖的是一个IOLoop。最简单的用法如下:

import asyncio

loop = asyncio.get_event_loop()

async def test():
    print("test is run")
    await asyncio.sleep(5)
    print("test is run over")


for i in range(5):
    loop.create_task(test())

loop.run_forever()

带async的函数是一个协程,可以随时调用create_task来将协程包装为任务。 await关键词顾名思义,就是async wait。它将异步化为同步。在同个协程中,await的上下文有序。也就是说,它会“阻塞”住当前协程(但不需要担心,其它协程还是会在loop下好好的运行),直到await后的协程返回结果。 单实例下一种常见的“错误”写法如下:

import asyncio

loop = asyncio.get_event_loop()

async def test():
    print("test is run")
    await asyncio.sleep(5)
    print("test is run over")

async def run():
    for i in range(5):
        await test()

loop.create_task(run())
loop.run_forever()

在这个程序中, test is run 会每隔5秒出现一次。单实例下,await将异步化为了同步。具体奥妙,须慢慢体会。

create_task 不会阻塞住协程,如果需要等待任务完成,可以在协程中await task.

import asyncio

loop = asyncio.get_event_loop()

async def test():
    print("test is run")
    await asyncio.sleep(5)
    print("test is run over")

async def run():
    tasks = []
    for i in range(5):
        tasks.append(loop.create_task(test()))

    await asyncio.wait(tasks)
    # 也可以
    # for task in tasks:
    #     await task

    print("over")

loop.create_task(run())
loop.run_forever()

在框架中,我们不需要关心loop。所以在实作中,需要上下文有序,则用await等待。不需要,则直接create_task。

手工实现

如果知道协程的原理,则很容易写出简单的“协程” 比如传统的生产消费模式:

import time

prev_fib = 1
fib = 1


def producer():
    global fib
    while 1:
        yield fib


def consumer():
    global fib
    global prev_fib

    while 1:
        now_fib = yield
        print(fib)
        fib = now_fib + prev_fib
        prev_fib = now_fib


p1 = producer()
p2 = consumer()
next(p2)
while 1:
    item = next(p1)
    p2.send(item)
    time.sleep(0.1)

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • grpc使用一览子

    然后,要用protobuf把它编译成对应的语言代码。 首先安装protoc,偷个懒,别人早就编译好了。直接用就行。

    超级大猪
  • sanic:安装py3.6与sanic套装

    超级大猪
  • pandoc 转换markdown到html

    超级大猪
  • 转向线下:互联网线上发展新革命

    孟永辉
  • linux学习第六十二篇:添加自定义监控项目,配置邮件告警,测试告警,不发邮件的问题处理

    添加自定义监控项目 需求:监控某台web的80端口连接数,并出图 两步:1)zabbix监控中心创建监控项目;2)针对该监控项目以图形展现 对于第一步,需要到客...

    用户1215343
  • 号外!谷歌宣布封停Google+,50万用户信息泄露

    新智元报道 来源:blog.google,TechCrunch,The Wall Street Journal ,techxplore 编辑:三石

    新智元
  • Python学习,爬虫不一定非要抓数据,也可以做自己喜欢的应用程序

    最近各种负面消息,对爬虫er来说,并不是很友好,当然这个是对于从业者来说的,对像我这样的正在学习python的个人来说,python爬虫的学习只需要保持以下几点...

    云飞
  • 基于Google App Engine 的Adsense投放监控系统

             题外话,如果让我选择我最讨厌的一种计算机程序语言,排名第一的是Python。原因只有一个,这种靠缩进来区分块block的语法格式太折...

    田春峰-JCJC错别字检测
  • Scratch中“面向对象”思想的体现——儿童积木编程与代码编程的联系

    Scratch是MIT面向少年儿童设计的一款搭积木式的编程软件。对零基础的少年儿童(尤其针对8-16岁)及零基础的成年人普及编程、编程入门具有重大意义。对于教育...

    一石匠人
  • Python学习,爬虫不一定非要抓数据,也可以做自己喜欢的应用程序

    最近各种负面消息,对爬虫er来说,并不是很友好,当然这个是对于从业者来说的,对像我这样的正在学习python的个人来说,python爬虫的学习只需要保持以下几点...

    云飞

扫码关注云+社区

领取腾讯云代金券