前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 高并发之基 协程(上篇)

Python 高并发之基 协程(上篇)

原创
作者头像
python编程从入门到实践
修改2020-06-15 10:51:34
1.5K0
修改2020-06-15 10:51:34
举报

本文主要以 asyncio 来介绍 协程 使用相关内容

在Python 中有进程、线程、还有协程。为何大家都推崇多用协程呢?其最主要的一点是:协程是用户级线程,其调度、切换在用户态 而 线程、进程 属于操作系统级别的调度 涉及到调度、上下文的切换 需要用户态与内核态进行切换 想比较 协程是消耗资源最少的。 不知你有没有这样的经历,明明我使用了多线程 ,线程数也有好多 但是执行下来发现 多线程执行的效率还比串行的差,那问题出在哪里呢?最主要的还是cpu 主要消耗在上下文切换上了。

好,今天我们用 python 提供的 asyncio 模块来介绍一下 协程的相关内容。

在使用 这个模块之前 我们先介绍几个概念:

1.future object 我们暂且称这是一个特殊的对象

1.1.含有此对象的函数调用不会立刻被执行,返回结果

1.2.调用后返回的是一个协程对象

2.协程

2.1.首先是一个对象,这个对象是调用1 中 返回的结果

2.2.一个协程表示一组特定操作

2.3.如何创建一个协程? 调用 1 中对象

3.任务对象

3.1.是协程对象的高级形式

4.事件循环 eventloop

4.1.事件循环是用来装载任务(协程)对象的。我们可以把事件循环当做一个容器,其中可以放很多个任务对象

4.2.若事件循环存放了多个任务对象且事件循环启动后,则事件循环对象就可以异步的将每一个任务对象对应的执行操作执行

有了以上的基本概念后我们来看一个简单的case 来说明一下:

代码语言:javascript
复制
# -*- encoding: utf-8 -*-
# !/usr/bin/python
"""
@File    : sleep_schedule.py
@Time    : 2020/6/14 9:23
@Author  : haishiniu
@Software: PyCharm
"""
import asyncio
import asyncio.coroutines

def _set_result_unless_cancelled(fut, result):
    if fut.cancelled():
        return
    print("this is a rewrited sleep callback function")
    fut.set_result(result)

# asyncio.sleep()函数的实现版本
@asyncio.coroutine
def dalong_sleep(delay, result=None, *, loop=None):
    """Coroutine that completes after a given time (in seconds)."""
    if delay == 0:
        yield
        return result

    future = loop.create_future()
    h = future._loop.call_later(delay,
                                _set_result_unless_cancelled,
                                future, result)
    try:
        return (yield from future)
    finally:
        h.cancel()


async def cor_one():
    print(" coroutine cor_one start......")
    await dalong_sleep(1, loop = event_loop)
    print(" coroutine cor_one end......")

def call_back(res):
    print("this is cor_one's callback fucntion")

event_loop = asyncio.get_event_loop()
task = event_loop.create_task(cor_one())
task.add_done_callback(call_back)
event_loop.run_until_complete(task)

通过上图代码 我们可以得知:

1.我们先通过 event_loop = asyncio.get_event_loop() 创建了一个事件循环

2.通过 task = event_loop.create_task(cor_one()) 创建了一个任务,并且将任务添加到事件循环当中

3.通过 task.add_done_callback(call_back) 我们给这个任务 Task 添加了一个回调函数 call_back

4. 通过 event_loop.run_until_complete(task) 我们 就开启 事件循环 直到这个任务执行结束。

我们再对代码中的一些细节进行简单的介绍,有助于大家更好的去理解这不部分代码。

1.async

如果一个函数被这个async 关键词修饰 那这个函数就是一个 future object

2.await

协程对象执行到这个关键词定义之处就会做挂起操作,原理是与yield /yield from 类似的。

通过本文,我们基本已经掌握了 使用 python 的 asyncio 模块来进行 写协程相关的代码,对于提升执行效率还是很有帮助的,还请大家多多尝试,多多练习,好了 本篇我们就先介绍到这里下一篇我们呢会重点讲讲 asyncio 这个模块背后执行的流程 让大家从源码的层面上对python 协程编程有一个更加深入的理解。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档