前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python:python中异步的使用姿势

python:python中异步的使用姿势

作者头像
超级大猪
发布2019-11-21 20:36:49
9210
发布2019-11-21 20:36:49
举报
文章被收录于专栏:大猪的笔记大猪的笔记

async

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

代码语言:javascript
复制
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后的协程返回结果。 单实例下一种常见的“错误”写法如下:

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

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

手工实现

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

代码语言:javascript
复制
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)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-10-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • async
  • 手工实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档