协程是用户相互协作的线程,又称微线程,本身还是线程。

线程是系统级别的,它们是由操作系统调度;协程是程序级别的,由程序员根据需要自己调度。我们把一个线程中的一个个函数叫做子程序,那么子程序在执行过程中可以中断去执行别的子程序;别的子程序也可以中断回来继续执行之前的子程序,这就是协程。也就是说同一线程下的一段代码<1>执行着执行着就可以中断,然后跳去执行另一段代码,当再次回来执行代码块<1>的时候,接着从之前中断的地方开始执行。

优点:

  1. 极高的执行效率,因为子程序切换而不是线程切换,没有了线程切换的开销;
  2. 不需要多线程的锁机制,因为只有一个线程在执行;

并没有说协程就一定不加锁,协程本身的某些功能实现也是通过线程池实现的;就算没有用到其他线程,假如一个操作需要连续性地完成,那么也是需要借助锁的概念。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

关于协程及其锁的一些认识相关推荐

  1. python并发编程--进程、线程、协程、锁、池、队列

    文章目录 操作系统的概念 进程 multiprocessing模块 守护进程 使用多进程实现一个并发的socket的server 锁 生产者消费者模型 数据共享 线程threading模块 守护线程和 ...

  2. python3 asyncio原理_Python3 asyncio Lock 协程锁实现原理

    class Lock: """ 协程锁对象 """ def __init__(self, *, loop=None): # 创建一个_wai ...

  3. Go协程通道锁故事化理解

    通道的故事 老大交给小兵任务,从仓库运大米到老大家,小兵就去仓库取到大米,找到大米之后,运到老大家,如果不运到老大家的话,就会一直扛着,身体受不了,就会dead lock.必须有老大家进行接收. 老大 ...

  4. 爱奇艺网络协程编写高并发应用实践

    作者 | 爱奇艺技术产品团队 责编 | 屠敏 出品 | CSDN 博客 本⽂以爱奇艺开源的网络协程库(https://github.com/iqiyi/libfiber )为例,讲解网络协程的设计原理 ...

  5. Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet

    主要内容: 线程的一些其他方法 线程事件 线程队列 线程池 GIL锁 协程 Greenlet Gevent 一. 线程(threading)的一些其他方法 from threading import ...

  6. 十、Go协程的调度,互斥锁,计数器和线程池

    @Author:Runsen 在字节面试中,我见过:GO语言中的协程与Python中的协程的区别?其实就是要我讲解Go中GMP机制.我表示很多都用过,但是底层不了解. 那时我只知道与传统的系统级线程和 ...

  7. GIL线程全局锁 协程

    GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.对于io密集型任务 ...

  8. Python之进程+线程+协程(并发与并行、GIL锁、同步锁、死锁、递归锁)

    文章目录 一.并发与并行 二.同步与异步 三.线程锁 1.GIL全局解释器锁 2.同步锁 3.死锁 4.递归锁 在Python中GIL解释器锁.同步锁.死锁.递归锁都是什么?怎么这么多锁,它们都是用来 ...

  9. python 协程库gevent学习 -- 超时、互斥锁(BoundedSemaphore)、local

    1.Timeout错误类 晚上在调试调用第三方接口的时候,发现有些接口耗时非常多,觉得应该有个超时接口来限制他们的过长时间的不结束.我开始尝试了requests上面的timeout参数,整个代码流程里 ...

最新文章

  1. JS window对象 返回前一个浏览的页面 back()方法,加载 history 列表中的前一个 URL。 语法: window.history.back();...
  2. Golang练习题(自己认为比较不错的)
  3. 斗鱼回应与虎牙合并;Android 11 Beta 3 发布| 极客头条
  4. [转]jquery的ajax交付时“加载中”提示的处理方法
  5. Error(1.0.5 1107071739): D:\SAE_SDK_Windows_1.0...
  6. CKfinder中文乱码的解决.
  7. 一个火车上遇到的女孩所引发的联想
  8. leetcode1037 有效的回旋镖(Java练习)
  9. h3c无线控制器常用命令(wx)
  10. RFBNet模型推理
  11. Android之飞鹅WiFi打印机
  12. Ignoring invalid timezone passed to Connection
  13. android 手机如何截屏,安卓手机一般怎么截屏 安卓如何截图手机屏幕 - 云骑士一键重装系统...
  14. 前方荆棘遍地,愿砥砺前行
  15. gamma correct blurring
  16. 继昨天的猜拳游戏,升级为老虎机版
  17. Vim中如何全选并复制?
  18. linux c编译安装,uClinux设置(安装,编译)
  19. 分享一个python生成ico图片程序
  20. 树莓派linux下gpio驱动,树莓派官方自带gpio驱动bcm2708_gpio.c原理分析 linux gpio架构 gpio子系统...

热门文章

  1. 如何在自己开发的日程管理页面插入提醒功能_给大家推荐一款高颜值的日程管理类APP...
  2. java 继承 this_java多重继承的this属于谁
  3. java list实现九九乘法表梯形_JavaScript实现梯形乘法表的方法
  4. java webservice用户验证_java webservice 用户验证 (服务端 + 客户端)
  5. dfs深度优先搜索_图的深度优先搜索(DFS)
  6. python中rjust_Python字符串rjust()和ljust()
  7. kotlin方法类型_Kotlin类型检查,Kotlin类型铸造
  8. jsf面试题_JSF面试问答
  9. java中的命令行参数_Java中的命令行参数
  10. c++重载++和--