一、进程

  1、multiprocessing模块实现多进程并发。

    1.1multiprocessing包是Python中的多进程管理包,与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程  该进程可以运行在Python程序内部编写的函数,属于父进程和子进程的关系。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。

    1.2Process类的简绍 

    构造方法(参数介绍):

      Process([group [, target [, name [, args [, kwargs]]]]])

      group参数未使用,值始终为None

      target表示调用对象,即子进程要执行的任务
      args表示调用对象的位置参数元组,args=(1,2,'egon',)
      kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}
      name为子进程的名称

    实例方法(方法介绍):

      p.start():启动进程,并调用该子进程中的p.run()(进程准备就绪,等待CPU调度)
      p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法(strat()调用run方法,如果实例进程时未制定传入target,这star执行t默认run()方法。)
      p.terminate():强制终止进程p(不管任务是否完成,立即停止工作进程),不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
      p.is_alive():如果p仍然运行,返回True
      p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程 (阻塞当前上下文环境的进程程,直到调用此方法的进程终止或到达指定的timeout(可选参数)

    属性(属性介绍):

       p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置

       p.name:进程的名称

       p.pid:进程的pid

      p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可)
      p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)

    1.3、实例操作

      注意:在windows中Process()必须放到# if __name__ == '__main__':下

      

  2、进程间通信方法——进程队列

    2.1进程队列queue,与线程队列相似,如图所示:

      

  2.2管道(pipe),如图所示:

      

      注释:Pipe()返回的两个连接对象代表管道的两端。 每个连接对象都有send()和recv()方法(等等)。 请注意,如果两个进程(或线程)尝试同时读取或写入管道的同一端,管道中的数据可能会损坏。

  2.3manager()进程之间数据共享,如图所示:

    

    注释:父进程必须等到子进程执行完成后才能执行下一步。

      Queue和pipe只是实现了数据交互,并没实现数据共享,但是manager是一个进程去更改另一个进程的数据.

  3、进程池

    3.1什么是进程池?

     进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程序列,如果进程池中没有可供使用的进程序列,那么程序就  会等待,直到进程池中有可用进程序列为止。

    3.2如图所示:

      

      进程池中有以下几个主要方法:

         apply:从进程池里取一个进程并执行

         apply_async:apply的异步版本,一次性取完后再执行

         terminate:立刻关闭线程池

         close:等待所有进程结束后,才关闭线程池

         join:主进程等待所有子进程执行完毕,必须在close或terminate之后

二、协成

  1、什么是协成?  

  协程,是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。、

  2、协成特点

    协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器  上下文和栈。因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状  态,换种说法:进入上一次离开时所处逻辑流的位置。

  3、yield与协成,如图所示:

    

  4、greenlet实现协成

    

    greenlet机制的主要思想是:生成器函数或者协程函数中的yield语句挂起函数的执行,直到稍后使用next()或send()操作进行恢复为止。  可以使用一个调度器循环在一组生成器函数之间协作多个任务。greentlet是python中实现我们所谓的"Coroutine(协程)"的一个基础库.

  5、gevent实现协成

    

    注释:同比之前上面两个实现协成的方式而言,当gevent实现协成遇到IO操作时会切换到下一个任务中,大大的节省了cpu执行程序的时间

    注释:

    协程的好处:无需线程上下文切换的开销,无需原子操作锁定及同步的开销;方便切换控制流,简化编程模型;高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。
    缺点:无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序

         

    

     

python基础26 -----python进程及协成的更多相关文章

  1. Python菜鸟之路:Python基础-线程、进程、协程

    上节内容,简单的介绍了线程和进程,并且介绍了Python中的GIL机制.本节详细介绍线程.进程以及协程的概念及实现. 线程 基本使用 方法1: 创建一个threading.Thread对象,在它的初始 ...

  2. Python基础—线程、进程和协程

    今天已是学习Python的第十一天,来干一碗鸡汤继续今天的内容,今天的鸡汤是:超越别人对你的期望.本篇博客主要介绍以下几点内容: 线程的基本使用: 线程的锁机制: 生产者消费之模型(队列): 如何自定 ...

  3. Python之线程、进程和协程

    python之线程.进程和协程 目录: 引言 一.线程 1.1 普通的多线程 1.2 自定义线程类 1.3 线程锁 1.3.1 未使用锁 1.3.2 普通锁Lock和RLock 1.3.3 信号量(S ...

  4. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  5. python自动化开发学习 进程, 线程, 协程

    python自动化开发学习 进程, 线程, 协程   前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...

  6. 二十一. Python基础(21)--Python基础(21)

    二十一. Python基础(21)--Python基础(21) 1 ● 类的命名空间 #对于类的静态属性:     #类.属性: 调用的就是类中的属性     #对象.属性: 先从自己的内存空间里找名 ...

  7. python基础-初识Python和不同语言之间的区别

    一.Python的创始人谁? Python之父:吉多·范罗苏姆GuidovanRossum 吉多·范罗苏姆是一名荷兰计算机程序员,他作为Python程序设计语言的作者而为人们熟知.在Python社区, ...

  8. Python基础+Pythonweb+Python扩展+Python选修四大专题 超强麦子学院Python35G视频教程

    [保持在百度网盘中的, 可以在观看,嘿嘿 内容有点多,要想下载, 回复后就可以查看下载地址,资源收集不易,请好好珍惜] 下载地址:http://www.fu83.cc/ 感觉文章好,可以小手一抖 -- ...

  9. Python基础 初识Python

    机器码 机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据. 通常意义上来理解的话,机器码就是计算机可以直接执行,并且执 ...

随机推荐

  1. Redis入门经典——The Little Redis Book (翻译)

    The Little Redis Book By Karl Seguin 关于本书:本书全然免费下载.你能够任意转载,复制.但请你注明作者.Karl Seguin.译者,WY. 以及不要用于商业用途. ...

  2. 机器人的运动范围 剑指offer66题

    include "stdafx.h" #include<vector> #include<algorithm> #include<string> ...

  3. 在虚拟机VMware Workstation上安装win7系统

    之前讲过虚拟机的安装过程,虚拟机安装完成之后,就需要在虚拟机上安装操作系统了,这次就讲讲怎么在虚拟机上安装操作系统. 工具/原料   VMware Workstation win7系统盘 iso格式 ...

  4. python 面向对象三大特性(封装 多态 继承)

    今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面 ...

  5. Linq源代码阅读

    在 System.Core dotnet451\source\ndp\fx\src\core\system\linq\enumerable.cs Where 和 Select 内 ,把数组和List分 ...

  6. Unity3D学习笔记——NGUI使用常见问题

    一:在Scene中右键创建UI组件. 首先要确定NGUI中的红框能看见,我的就是之前无法现实红框,所以右键无法新建UI组件, 原因是:UIPanel没启用. 启用方法: 启用前和启用后NGUI界面对比 ...

  7. 关于 JavaScript 学习 —— 好的博客或者网站推荐

    作者:Tw93链接:https://www.zhihu.com/question/19651401/answer/46211739来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  8. [MongoDB]学习笔记--Linux 安装和运行MongoDB

    背景知识 MongoDB 是用C++写的, 开源的, NoSQL(Not Only SQL)文档数据库. 特点:high performance(高性能), high availability(高可靠 ...

  9. 解决EasyNVR现场无固定公网IP的问题,万千企业期待的EasyNVS管理平台是什么?

    前言 EasyNVS云管理平台已经研发上线,今天就来给大家讲解一下EasyNVS到底是个啥,有什么特殊的功能呢? 首先,我们先从EasyNVR智能云终端(以前我们常称之为EasyNVR无插件直播服务器 ...

  10. linux中常见的文件操作命令

    由于经常在linux发布工程进行测试,所以要用到linux一些文件操作命令,再此进行总结,以便以后忘记的时候查看. 改变目录:cd 回到家目录 cd或者cd~ 查看当前目录:pwd 查看目录下的文件的 ...