python协程入门

背景

python对于多线程受限于GIL(全局解释器锁)导致其性能大大降低,并不能实现真正意义上的并发。用协程倒是一个节约内存提升效率的不错Idea。

一.了解几个概念

  1. 什么是异步任务?
    所谓异步任务就是,在进行IO(Input/Output)操作时或者在进行耗时操作的时候,不必等待程序立马结束返回结果,你可以继续做其他的事情,当它结束的时候会得到通知。
    举个栗子:
    在平时的生活当中我们经常会进行短信注册,这个时候它就用的是异步任务。

  2. 什么是协程?
    协程的英文是Coroutine,是一个微线程,协程的调度由用户程序来控制

  3. 线程,进程,协程的区别?

  • 进程是CPU级别的,是操作系统分配资源的最小单元
  • 线程是运行在进程中的,是CPU调度和分配的基本单元
    协程,线程,进程的区别

二.asyncio的使用

  1. 安装asyncio
pip install asyncio
  1. 定义协程
async def do_some_work(x): pass
  1. asyncio的基本使用demo
# -*-coding:utf-8-*-
import asyncio
import functools


async def multi_fun(x):
    print("waiting:{}".format(x))
    await asyncio.sleep(x)
    # loop.stop()  # 手动结束loop


async def multi_funs(x):
    print("waiting:{}".format(x))
    await multi_fun(x)


def done_callback(trans):
    print("Done", trans)
    loop.stop()


async def timer(x, cb):
    futu = asyncio.ensure_future(asyncio.sleep(x))
    futu.add_done_callback(cb)
    await futu


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    # 1.run_util_complete()方法运行协程
    loop.run_until_complete(multi_fun(3))
    loop.run_until_complete(asyncio.ensure_future(multi_fun(x=3)))

    # 2.协程执行完成后回调方法
    en_fun = asyncio.ensure_future(multi_fun(3))
    en_fun.add_done_callback(done_callback)
    loop.run_until_complete(en_fun)

    # 3.运行多个协程,coroutine gather,运行完成后回调结束
    coroutine_list = [multi_fun(3), multi_funs(5)]
    multi_coroutine = asyncio.gather(*coroutine_list)
    multi_coroutine.add_done_callback(done_callback)
    loop.run_until_complete(multi_coroutine)

    # 4.run_forever()方法运行协程,方法内部手动结束协程
    asyncio.ensure_future(multi_fun(5))
    loop.run_forever()

    # 5.run_forever()方法运行,回调结束
    coroutine_list = [multi_fun(5), multi_funs(3)]
    _gather = asyncio.gather(*coroutine_list)
    _gather.add_done_callback(functools.partial(done_callback))
    loop.run_forever()

    #  6.gather 和wait的用法
    coroutine_list = [multi_fun(5), multi_funs(3)]
    loop.run_until_complete(asyncio.wait(coroutine_list))

    t = timer(3, lambda futu: print('Done'))
    loop.run_until_complete(t)

    # 关闭loop,以彻底清除loop对象防止误用
    loop.close()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值