python协程和线程_线程和协程之间的区别
线程和协程之间的区别很大,甚至大过进程和线程之间的区别。线程建立在进程之上,协程建立在线程之上。那么协程是什么呢?
协程是一段计算机程序,它一般是一个协作类型的子程序,执行时允许暂停和恢复。协程非常适合实现熟知的程序,例如协作任务,异常,事件循环,迭代器,无限列表和管道。
协程与我们熟知的函数不同(函数也是一段计算机程序)。函数总是一个入口,一次返回,调用顺序明确,但是协程的调用可以中断,然后执行其它程序,在适当的时候再返回来继续执行,可以实现多次返回。
以异常为例。在操作系统中或者其它语言实现中,例如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协程和线程_线程和协程之间的区别相关推荐
- 协程简史,一文讲清楚协程的起源、发展和实现
/ 今日科技快讯 / 北京时间10月5日下午,在瑞典首都斯德哥尔摩,瑞典皇家科学院宣布,将2022年诺贝尔化学奖授予美国化学家卡罗琳·贝尔托西.丹麦化学家摩顿·梅尔达尔和美国化学家卡尔·巴里· ...
- python协程是什么_在python中线程和协程的区别是什么
在python中线程和协程的区别:1.一个线程可以拥有多个协程,这样在python中就能使用多核CPU:2.线程是同步机制,而协程是异步:3. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进 ...
- python 协程可以嵌套协程吗_Python线程、协程探究(2)——揭开协程的神秘面纱...
一.上集回顾 在上一篇中我们主要研究了python的多线程困境,发现多核情况下由于GIL的存在,python的多线程程序无法发挥多线程该有的并行威力.在文章的结尾,我们提出如下需求: 既然python ...
- python 协程、进程、线程_Python的进程、线程和协程 · Donzy’s Blogs
0.前言 在计算机技术领域,吞吐量(throughput)是计算机在指定的一段时间内完成编程技术如何影响.本文主要讨论Python的多进程.多线程及协程等编程技术在不同场景下对系统吞吐量的影响. 1. ...
- python在主线程上下文执行_线程进程系列*(Python)
一 ,线程的两种调用方式 threading 模块建立在thread 模块之上.thread模块以低级.原始的方式来处理和控制线程,而threading 模块通过对thread进行二次封装, 提供了更 ...
- 动手实现Kotlin协程同步切换线程,以及Kotlin协程是如何实现线程切换的
前言 突发奇想想搞一个同步切换线程的Kotlin协程,而不用各种withContext(){},可以减少嵌套且逻辑更清晰,想实现的结果如下图: 分析 实现我们想要的结果,首先需要知道协程为什么可以控制 ...
- 协程,又称微线程和纤程
协程,又称微线程和纤程等,据说源于 Simula 和 Modula-2 语言(我没有深究,有错请指正),现代编程语言基本上都有支持,比如 Lua.ruby 和最新的 Google Go,当然也还有最近 ...
- UNITY所谓的异步加载几乎全部是协程,不是线程;MAP3加载时解压非常慢
UNITY所谓的异步加载几乎全部是协程,不是线程;MAP3加载时解压非常慢 实践证明,以下东西都是协程,并非线程(thread): 1,WWW 2,AssetBundle.LoadFromFileAs ...
- Kotlin学习笔记26 协程part6 协程与线程的关系 Dispatchers.Unconfined 协程调试 协程上下文切换 Job详解 父子协程的关系
参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 1 协程与线程的关系 import kotlinx.coroutines.* import java.util.concu ...
最新文章
- 硬件巨头正在崛起,中国独占鳌头
- python实用性函数分享_分享|3个开源的 Python Shell
- 从零玩转HTML5前端+跨平台开发上
- 力扣- -去除重复字母
- c语言cobegin用法,用C语言实现P、V操作
- BZOJ 1051: [HAOI2006]受欢迎的牛
- 广州.net俱乐部12月份ABP框架活动场地征集、志愿者征集、合作讲师\副讲师征集...
- 应用程序的8个关键性能指标以及测量方法
- mac预装的php路径,Mac使用系统自带php和Apache
- 你会和丑且家境不好,但对你好的男孩结婚吗?
- python 字符串加密 唯一数字_python实现字符串加密 生成唯一固定长度字符串
- 小知识--DOS命令1
- 多网卡下同网段内所有网卡共用一个IP的问题分析
- imx 290 支持25fps
- 怎么设置计算机桌面字体大小,Win7桌面字体大小怎么调?Win7系统电脑桌面字体大小设置方法...
- 【信息学奥赛一本通 提高组】第三章 深搜的剪枝技巧
- JSONObject 与 JSON 互转
- 1133_SICP开发环境搭建
- UWP-Naïve Media Player 2.0
- 通过XMind Update制作思维导图