提到程序的并发操作,大多数人程序员首先想到的进程或者线程。我们先复习一下进程和线程的概念。
  进程:
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序执行的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体
  线程:
线程,是程序执行的最小单元。一个标注的线程由线程ID,当前指令指针,寄存器集合和堆栈组成。另外,线程也是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可以与同属一个进程的其他线程共享进程所拥有全部资源。一个线程创建和撤销另一个线程,同一个进程中的多个线程并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有运行、阻塞、和就绪三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机。运行状态是指线程战友处理剂正在运行。阻塞状态是指线程在等待一个事件,逻辑上不可执行。每个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
(以上内容来自百度百科,它从哪里来的就不知道了 ┑( ̄Д  ̄)┍ )

然后再说我们今天的主角协程
协程最大的优势是他比线程更高的执行效率。协程不需要切换线程,没有线程切换的开销。和多线程相比,线程数量越多,协程的性能优势就越明显。第二大优势就是不需要多线程锁机制。因为只有一个线程,也不存在同时写变量冲突(意思就是说协程在同一时刻绝对只有一个在执行,多线程中如果多个线程都需要对某变量进行修改,如果不加入多线程锁,就可能出现多个线程同时对一个变量进行修改的问题)所以协程执行效率要高得多。协程只在一个线程中执行。如果想要利用多核cpu,最简单的办法是多进程+协程。

gevent:
Python通过yield提供了对协程的基本支持,但是不完全。而第三方的gevent 为Python提供了比较完善的协程支持。

当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。

由于切换是在IO操作时自动完成,所以gevent需要修改Python自带的一些标准库,这一过程在启动时通过monkey patch完成

使用方法

from gevent import monkey; monkey.patch_socket()
import geventdef f(p):print p
spawns = []
spawns.append(gevent.spawn(f,55))
spawns.append(gevent.spawn(f,13))
spawns.append(gevent.spawn(f,66))
gevent.joinall(spawns)

以上就是我在写程序是最常用到的部分,程序会在所有spawns都执行完毕后,接着执行 gevent.joinall(spawns) 后面的代码
另外网上说gevent只能在Linux/Unix下运行,在Windows下不能保证正常安装和运行。亲测,以上说法纯属胡说八道。

协程的概念及Python中利用第三方库gevent使用协程相关推荐

  1. python怎样在已有excel文件指定行写入-Python中使用第三方库xlrd来写入Excel文件示例...

    继上一篇文章使用xlrd来读Excel之后,这一篇文章就来介绍下,如何来写Excel,写Excel我们需要使用第三方库xlwt,和xlrd一样,xlrd表示read xls,xlwt表示write x ...

  2. python中利用jieba库统计词频,counts[word] = counts.get(word,0)+1的使用

    import jieba txt = open("阿甘正传-网络版.txt","r",encoding ="utf-8").read() w ...

  3. python中的第三方库 cdk_用Jython调用CDK(Chemistry Development Kit)显示分子并高亮子结构...

    CDK是一个非常优秀的开发工具,几乎综合了化学信息学中所有常用的功能.但是这个工具似乎受众并不是太多,而且教程很少.可能的原因是毕竟它是个开源开发工具,化学工作者们可能对基于这工具的软件产品更有兴趣, ...

  4. 查看python库的版本-python中查看第三方库的版本号

    (1)方法一 import scrapy scrapy.__version__ Out[13]: '1.5.1' (2)方法二 help(scrapy) Help on package scrapy: ...

  5. python中的第三方库 cv2_cv2 python

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  6. python的excell库_Python中使用第三方库xlrd来写入Excel文件示例

    继上一篇文章使用xlrd来读Excel之后,这一篇文章就来介绍下,如何来写Excel,写Excel我们需要使用第三方库xlwt,和xlrd一样,xlrd表示read xls,xlwt表示write x ...

  7. python导入excel类库_Python中使用第三方库xlutils来追加写入Excel文件示例

    Python中使用第三方库xlutils来追加写入Excel文件示例 目前还没有更好的方法来追写Excel,lorinnn在网上搜索到以及之后用到的方法就是使用第三方库xlutils来实现了这个功能, ...

  8. python pip安装第三方库老是报错_#python pip 安装dlib一直失败?#python安装dlib错误...

    #python pip 安装dlib一直失败?#python安装dlib错误 python dlib 教程2020-10-11 07:52:36人已围观 ubuntu里面怎么安装dlib 下面是在ub ...

  9. python多线程好还是多协程好_深入浅析python中的多进程、多线程、协程

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...

最新文章

  1. node.js创建WebSocket服务,并使用原生js ES6完成对WebSocket数据交互
  2. c oracle 中文列名,C#获取ORACLE列名的有关问题,这次够详细了吧。求帮助
  3. Oracle spatial 周边查询SQL
  4. 将JPG文件作为EXE执行
  5. boost::safe_numerics模块实现检测到的数据类型溢出的测试程序
  6. 在Linux服务器上配置phpMyAdmin--允许空密码
  7. mysql timeout
  8. Jenkins不同job之间传递参数
  9. ICPC程序设计题解书籍系列之六:吴永辉:《算法设计编程实验》
  10. JAVA小白启蒙篇:第一个SSM框架搭建示例(附源码下载)
  11. 湖州市技师学院的计算机,湖州技师学院
  12. 文本挖掘与matlab,文本挖掘与数据挖掘:发现差异
  13. 2022国开中国现代文学专题阶段作业2-4答案
  14. 模拟器xposed框架安装7.1-64教程
  15. Footprint:Aave VS Compound之战,谁更能脱颖而出?
  16. 几何算法合集(3D)
  17. 再也不担心写出臃肿的Flink流处理程序啦,发现一款将Flink与Spring生态完美融合的脚手架工程-懒松鼠Flink-Boot
  18. android半透明闪退,移动端常见面试题一:移动端兼容解决方案
  19. 学生信息管理系统(登录功能)
  20. 多种方法进行去基线处理

热门文章

  1. 成功解决FileNotFoundError: [Errno 2] No such file or directory: 'F:\\Program Files\\Python\\Python36\\li
  2. Python中斐波那契数列的四种写法
  3. 在Core WebApi中使用Swagger
  4. CSAPP:第三章程序的机器级表示1
  5. 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra
  6. tnsname.ora
  7. This 在 C# 中的含义
  8. UITextField
  9. POJ2301+水~~~~~~
  10. 【转】浅谈MS-SQL锁机制