关于协程及其锁的一些认识
协程是用户相互协作的线程,又称微线程,本身还是线程。
线程是系统级别的,它们是由操作系统调度;协程是程序级别的,由程序员根据需要自己调度。我们把一个线程中的一个个函数叫做子程序,那么子程序在执行过程中可以中断去执行别的子程序;别的子程序也可以中断回来继续执行之前的子程序,这就是协程。也就是说同一线程下的一段代码<1>执行着执行着就可以中断,然后跳去执行另一段代码,当再次回来执行代码块<1>的时候,接着从之前中断的地方开始执行。
优点:
- 极高的执行效率,因为子程序切换而不是线程切换,没有了线程切换的开销;
- 不需要多线程的锁机制,因为只有一个线程在执行;
并没有说协程就一定不加锁,协程本身的某些功能实现也是通过线程池实现的;就算没有用到其他线程,假如一个操作需要连续性地完成,那么也是需要借助锁的概念。asyncio 和 gevent 库中都有实现 threading 下的一些同步机制,比如 Lock、Semaphore 等,虽然和 threading 的底层的实现不同,但是同样起到了保证一些操作顺序、不会被打断地执行。
Gevent: (实现遇到IO自动切换)
Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。
gevent是一个基于协程(coroutine)的Python网络函数库,通过使用greenlet提供了一个在libev事件循环顶部的高级别并发API。 主要特性有以下几点: 基于libev的快速事件循环,Linux上面的是epoll机制 基于greenlet的轻量级执行单元 API复用了Python标准库里的内容 支持SSL的协作式sockets 可通过线程池或c-ares实现DNS查询 通过monkey patching功能来使得第三方模块变成协作式
Monket patching Python的运行环境允许我们在运行时修改大部分的对象,包括模块、类甚至函数。虽然这样做会产生“隐式的副作用”,而且出现问题很难调试,但在需要修改Python本身的基础行为时,Monkey patching就派上用场了。Monkey patching能够使得gevent修改标准库里面大部分的阻塞式系统调用,包括socket,ssl,threading和select等模块,而变成协作式运行。 Semaphore和BoundedSemphore 都是信号量类, 有进/线/协程获得信号量时(即acquire())计数器-1,释放信号量时(release())技术器+1,计数器为0的时候其他线/进/协程就被阻塞无法获得信号量。当计数器为设定好的上限的时候BoundedSemaphore就无法进行release()操作,Semaphore没有这个限制。
参考文献:https://www.cnblogs.com/zhangyux/p/6195860.html
转载于:https://www.cnblogs.com/kidl/p/9339967.html
关于协程及其锁的一些认识相关推荐
- python并发编程--进程、线程、协程、锁、池、队列
文章目录 操作系统的概念 进程 multiprocessing模块 守护进程 使用多进程实现一个并发的socket的server 锁 生产者消费者模型 数据共享 线程threading模块 守护线程和 ...
- python3 asyncio原理_Python3 asyncio Lock 协程锁实现原理
class Lock: """ 协程锁对象 """ def __init__(self, *, loop=None): # 创建一个_wai ...
- Go协程通道锁故事化理解
通道的故事 老大交给小兵任务,从仓库运大米到老大家,小兵就去仓库取到大米,找到大米之后,运到老大家,如果不运到老大家的话,就会一直扛着,身体受不了,就会dead lock.必须有老大家进行接收. 老大 ...
- 爱奇艺网络协程编写高并发应用实践
作者 | 爱奇艺技术产品团队 责编 | 屠敏 出品 | CSDN 博客 本⽂以爱奇艺开源的网络协程库(https://github.com/iqiyi/libfiber )为例,讲解网络协程的设计原理 ...
- Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet
主要内容: 线程的一些其他方法 线程事件 线程队列 线程池 GIL锁 协程 Greenlet Gevent 一. 线程(threading)的一些其他方法 from threading import ...
- 十、Go协程的调度,互斥锁,计数器和线程池
@Author:Runsen 在字节面试中,我见过:GO语言中的协程与Python中的协程的区别?其实就是要我讲解Go中GMP机制.我表示很多都用过,但是底层不了解. 那时我只知道与传统的系统级线程和 ...
- GIL线程全局锁 协程
GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.对于io密集型任务 ...
- Python之进程+线程+协程(并发与并行、GIL锁、同步锁、死锁、递归锁)
文章目录 一.并发与并行 二.同步与异步 三.线程锁 1.GIL全局解释器锁 2.同步锁 3.死锁 4.递归锁 在Python中GIL解释器锁.同步锁.死锁.递归锁都是什么?怎么这么多锁,它们都是用来 ...
- python 协程库gevent学习 -- 超时、互斥锁(BoundedSemaphore)、local
1.Timeout错误类 晚上在调试调用第三方接口的时候,发现有些接口耗时非常多,觉得应该有个超时接口来限制他们的过长时间的不结束.我开始尝试了requests上面的timeout参数,整个代码流程里 ...
最新文章
- JS window对象 返回前一个浏览的页面 back()方法,加载 history 列表中的前一个 URL。 语法: window.history.back();...
- Golang练习题(自己认为比较不错的)
- 斗鱼回应与虎牙合并;Android 11 Beta 3 发布| 极客头条
- [转]jquery的ajax交付时“加载中”提示的处理方法
- Error(1.0.5 1107071739): D:\SAE_SDK_Windows_1.0...
- CKfinder中文乱码的解决.
- 一个火车上遇到的女孩所引发的联想
- leetcode1037 有效的回旋镖(Java练习)
- h3c无线控制器常用命令(wx)
- RFBNet模型推理
- Android之飞鹅WiFi打印机
- Ignoring invalid timezone passed to Connection
- android 手机如何截屏,安卓手机一般怎么截屏 安卓如何截图手机屏幕 - 云骑士一键重装系统...
- 前方荆棘遍地,愿砥砺前行
- gamma correct blurring
- 继昨天的猜拳游戏,升级为老虎机版
- Vim中如何全选并复制?
- linux c编译安装,uClinux设置(安装,编译)
- 分享一个python生成ico图片程序
- 树莓派linux下gpio驱动,树莓派官方自带gpio驱动bcm2708_gpio.c原理分析 linux gpio架构 gpio子系统...
热门文章
- 如何在自己开发的日程管理页面插入提醒功能_给大家推荐一款高颜值的日程管理类APP...
- java 继承 this_java多重继承的this属于谁
- java list实现九九乘法表梯形_JavaScript实现梯形乘法表的方法
- java webservice用户验证_java webservice 用户验证 (服务端 + 客户端)
- dfs深度优先搜索_图的深度优先搜索(DFS)
- python中rjust_Python字符串rjust()和ljust()
- kotlin方法类型_Kotlin类型检查,Kotlin类型铸造
- jsf面试题_JSF面试问答
- java中的命令行参数_Java中的命令行参数
- c++重载++和--