zoukankan      html  css  js  c++  java
  • python协程 详解

    python 3.5中使用语法糖 async 和 await 实现协程。

    协程这个概念和进程、线程类似,都是程序运行的方式。使用协程可以高效的处理IO密集的问题,因为不需要出让GIL锁,它比多线程的速度要快。

    如何以协程的方式运行一个函数?

    首先使用async语法糖定义一个

    async def async_function():
      return 1

    这个函数原本是types.FunctionType, 使用语法糖后编程types.CoroutineType,可以使用协程执行

    执行这样的函数不能直接调用,直接调用会返回一个coroutine object,而是需要调用

    loop = asyncio.get_event_loop()
    res = loop.run_until_complete(buy_potatos())
    loop.close()

    await关键字是什么作用?

    1、只有用async包裹的函数和生成器才可以使用await关键字

    2、await用于挂起自身协程,等待其他协程完成。所以如果要同时执行多次函数,函数里的所有操作都需要加上await关键字

    这样才可以实现异步而非阻塞

    3、await后面的对象需要是一个Awaitable,或者实现了相关的协议。

    所以有一些操作,如打开文件、请求网站、等待时间需要使用特殊的对象。一个类实现了__await__方法,那么通过它构造出来的实例就是一个Awaitable

    async def func():
    await asyncio.sleep(0.5) #使用await time.sleep(1)会报错
    print(1)

    tasks = [asyncio.ensure_future(func()) for i in range(10)]
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))


    aiofiles.open(path, mode='wb')
  • 相关阅读:
    Django学习2
    Django学习1
    python 基于tcp协议的文件传输3_解决粘包问题
    python socketserver
    python hashlib
    python struct模块
    python json 模块
    python socket模块
    13暑假集训#10 总结
    hdu 4493 卡输入输出
  • 原文地址:https://www.cnblogs.com/yjybupt/p/14436969.html
Copyright © 2011-2022 走看看