线程和协程之间的区别很大,甚至大过进程和线程之间的区别。线程建立在进程之上,协程建立在线程之上。那么协程是什么呢?

协程是一段计算机程序,它一般是一个协作类型的子程序,执行时允许暂停和恢复。协程非常适合实现熟知的程序,例如协作任务,异常,事件循环,迭代器,无限列表和管道。

协程与我们熟知的函数不同(函数也是一段计算机程序)。函数总是一个入口,一次返回,调用顺序明确,但是协程的调用可以中断,然后执行其它程序,在适当的时候再返回来继续执行,可以实现多次返回。

以异常为例。在操作系统中或者其它语言实现中,例如Java,Python等,异常函数被系统全局注册,当一个函数在执行过程中出现异常,系统捕获到异常后,会直接把执行流程跳转到异常函数处执行异常函数,然后也可以跳回异常点继续执行余下的程序。

Python使用yield实现协程。实现原理主要是利用了生成器函数对象是在堆中被创建的,如下图所示:

线程栈中的局部变量G1,G2,和G3分别引用了堆中的生成器对象。只要这种引用存在,Python虚拟机就不会回收到堆中的生成器。假设有这样一种执行路径:生成器G1放弃执行权,G2代码执行,然后G3,最后回到G1继续执行。此时G1可以在中断点继续执行余下程序,并且执行的上下文跟中断之前是一模一样的。这种执行程序的方式可以类别进程调度,但是跟进程调度又有着巨大的区别。首先,G1,G2和G3一直在同一个线程下执行,三者一通操作之后,该线程甚至可以一直没有被操作系统调度。

这种执行方式看起来好像平平无奇,但是在适合的场景下使用可以发挥出巨大的威力。

为应对Web高并发场景,各大平台主流的解决方案是使用多线程。对每个请求生成一个线程来处理,虽然线程创建占用资源少,但是不要忘记,如果使用到内核线程,那么内核会创建很多线程,这必然会占用宝贵的内核资源。另外,线程切换也会消耗一部分CPU资源,如果线程太多,那么可能部分CPU运算全部消耗在线程调度上。所以,Java网络编程新增了NIO模块,使用异步加线程池的方式实现高并发。

在Python中,使用协程正好可以解决这种IO密集型场景。例如,如果有1万个请求,那么可以生成1万个协程来处理。系统只需要在堆中生成1万个生成器对象即可,并且没有调度带来的消耗。

听起来很美,实际协程的使用是有限制的。协程中的IO操作必须是非阻塞的,如果调用阻塞接口,那么操作系统一旦感知,必然会发生线程调度,把当前线程换出CPU的runqueue队列。另外,Python单个线程的性能实在太感人,所以如果想充分发挥协程的威力,最好的方式是多进程加协程的组合。

怎么在Python中使用协程?可以自己实现,也可以使用第三方库,如eventlet等。

来个小例子:

import time

def consumer():

while True:

x = yield

print 'consume value:%s ' % x

time.sleep(1)

def producer(consumer):

c = next(consumer)

for i in range(3):

consumer.send(i)

print 'produce value:%s ' % i

producer(consumer())

输出:

consume value:0

produce value:0

consume value:1

produce value:1

consume value:2

produce value:2

生产者和消费者交替执行。

小结

协程是在线程的基础上进行分时复用并发执行不同的程序段。它不是函数,也不是用户线程,更不是进程。

原文链接:https://blog.csdn.net/u010049696/article/details/112578887

python协程和线程_线程和协程之间的区别相关推荐

  1. 协程简史,一文讲清楚协程的起源、发展和实现

    /   今日科技快讯   / 北京时间10月5日下午,在瑞典首都斯德哥尔摩,瑞典皇家科学院宣布,将2022年诺贝尔化学奖授予美国化学家卡罗琳·贝尔托西.丹麦化学家摩顿·梅尔达尔和美国化学家卡尔·巴里· ...

  2. python协程是什么_在python中线程和协程的区别是什么

    在python中线程和协程的区别:1.一个线程可以拥有多个协程,这样在python中就能使用多核CPU:2.线程是同步机制,而协程是异步:3. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进 ...

  3. python 协程可以嵌套协程吗_Python线程、协程探究(2)——揭开协程的神秘面纱...

    一.上集回顾 在上一篇中我们主要研究了python的多线程困境,发现多核情况下由于GIL的存在,python的多线程程序无法发挥多线程该有的并行威力.在文章的结尾,我们提出如下需求: 既然python ...

  4. python 协程、进程、线程_Python的进程、线程和协程 · Donzy’s Blogs

    0.前言 在计算机技术领域,吞吐量(throughput)是计算机在指定的一段时间内完成编程技术如何影响.本文主要讨论Python的多进程.多线程及协程等编程技术在不同场景下对系统吞吐量的影响. 1. ...

  5. python在主线程上下文执行_线程进程系列*(Python)

    一 ,线程的两种调用方式 threading 模块建立在thread 模块之上.thread模块以低级.原始的方式来处理和控制线程,而threading 模块通过对thread进行二次封装, 提供了更 ...

  6. 动手实现Kotlin协程同步切换线程,以及Kotlin协程是如何实现线程切换的

    前言 突发奇想想搞一个同步切换线程的Kotlin协程,而不用各种withContext(){},可以减少嵌套且逻辑更清晰,想实现的结果如下图: 分析 实现我们想要的结果,首先需要知道协程为什么可以控制 ...

  7. 协程,又称微线程和纤程

    协程,又称微线程和纤程等,据说源于 Simula 和 Modula-2 语言(我没有深究,有错请指正),现代编程语言基本上都有支持,比如 Lua.ruby 和最新的 Google Go,当然也还有最近 ...

  8. UNITY所谓的异步加载几乎全部是协程,不是线程;MAP3加载时解压非常慢

    UNITY所谓的异步加载几乎全部是协程,不是线程;MAP3加载时解压非常慢 实践证明,以下东西都是协程,并非线程(thread): 1,WWW 2,AssetBundle.LoadFromFileAs ...

  9. Kotlin学习笔记26 协程part6 协程与线程的关系 Dispatchers.Unconfined 协程调试 协程上下文切换 Job详解 父子协程的关系

    参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 1 协程与线程的关系 import kotlinx.coroutines.* import java.util.concu ...

最新文章

  1. 硬件巨头正在崛起,中国独占鳌头
  2. python实用性函数分享_分享|3个开源的 Python Shell
  3. 从零玩转HTML5前端+跨平台开发上
  4. 力扣- -去除重复字母
  5. c语言cobegin用法,用C语言实现P、V操作
  6. BZOJ 1051: [HAOI2006]受欢迎的牛
  7. 广州.net俱乐部12月份ABP框架活动场地征集、志愿者征集、合作讲师\副讲师征集...
  8. 应用程序的8个关键性能指标以及测量方法
  9. mac预装的php路径,Mac使用系统自带php和Apache
  10. 你会和丑且家境不好,但对你好的男孩结婚吗?
  11. python 字符串加密 唯一数字_python实现字符串加密 生成唯一固定长度字符串
  12. 小知识--DOS命令1
  13. 多网卡下同网段内所有网卡共用一个IP的问题分析
  14. imx 290 支持25fps
  15. 怎么设置计算机桌面字体大小,Win7桌面字体大小怎么调?Win7系统电脑桌面字体大小设置方法...
  16. 【信息学奥赛一本通 提高组】第三章 深搜的剪枝技巧
  17. JSONObject 与 JSON 互转
  18. 1133_SICP开发环境搭建
  19. UWP-Naïve Media Player 2.0
  20. 通过XMind Update制作思维导图

热门文章

  1. 求大佬解答一下这道题
  2. 这一届程序媛的薪资比男生还高!程序媛时代已来?
  3. QML 信号和信号处理器程序
  4. 智能手机普及游戏 国内外巨头上演GPU芯片争霸
  5. 如何用CSS实现漂亮的个人资料卡效果
  6. itemdatabound小结
  7. nacos server 1.3 网盘地址
  8. 如何选择适合自己的靠谱培训机构
  9. 前端图片压缩解决办法
  10. 读MBA经历回顾(上)目的决定手段——北漂18年(48)