走入计算机的第三十八天(python的进程和协成))

一、进程

  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: 要执行的方法; 
      name: 进程名; 
      args/kwargs: 要传入方法的参数。

    实例方法:

      is_alive():返回进程是否在运行。

      join([timeout]):阻塞当前上下文环境的进程程,直到调用此方法的进程终止或到达指定的timeout(可选参数)。

      start():进程准备就绪,等待CPU调度

      run():strat()调用run方法,如果实例进程时未制定传入target,这star执行t默认run()方法。

      terminate():不管任务是否完成,立即停止工作进程

    属性:

      daemon:和线程的setDeamon功能一样

      name:进程名字。

      pid:进程号。

    1.3、实例操作

      

  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时)会阻塞掉整个程序

时间: 2024-10-12 13:51:35

走入计算机的第三十八天(python的进程和协成))的相关文章

python进程/线程/协成

1.谈谈对多进程多线程以及协成的理解 进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫做程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大 线程:调度执行的最小单位,也叫执行路径,不能独立存在,必须依赖进程存在,一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率. 协成:是一种用户太的轻量级线程,协成的调度完全由用户控制,协成拥有自己的寄存器上下文和栈.协成调度切换时,将寄存器上下文和

python基础26 -----python进程及协成

一.进程 1.multiprocessing模块实现多进程并发. 1.1multiprocessing包是Python中的多进程管理包,与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程 该进程可以运行在Python程序内部编写的函数,属于父进程和子进程的关系.该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法. 1.2Process类的简绍 构造方法: Process([gro

python的进程/线程/协程

1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有一个线程被执行. 多线程的特点: 线程比进程更轻量级,创建一个线程要比创建一个进程快10-100倍. 线程共享全局变量. 由于GIL的原因,当一个线程遇到IO操作时,会切换到另一个线程,所以线程适合IO密集型操作. 在多核cpu系统中,最大限度的利用多核,可以开启多个线程,开销比进程小的多,但是这并

走入计算机的第三十九天(python终结篇之IO模型)

一.IO模型 1.IO模型分类 1.阻塞IO--------blocking IO 2.非阻塞IO------nonblocking IO 3. 多路复用IO------- multiplexing 4.信号驱动IO-------signal driven IO (工作中不会使用到,只是作为了解) 5.异步IO------- asynchronous IO 2.通常情况下IO默认操作分为两个阶段(默认都是阻塞IO) 1.准备等待数据阶段,相当于请求操作系统是否有数据发送过来(调用IO操作). 2

走入计算机的第三十七天(python的高级用法)

一.Event 1.为什么会有Event? 线程的一个关键特性就是每个线程的运行都是独立运行且状态不可预测.如果程序中的线程需要通过别的线程的状态来判断自己线程中的 某个程序是否需要执行,那么Event就产生了. 2.Event的作用? threading库中Event对象主要是通过判断自己线程中的Event对象来判断是否唤醒所等待这个Event对象的线程,Event对象包含一个可由 线程设置的信号标志,默认情况下该信号标志为假,如果有别的线程等待这个Event对象时,当他为假时那么这些被等待的

走入计算机的第三十三天(异常处理和scoket编程)

一 异常处理 1 异常和错误,而错误分成了两种 一是语法错误,这种错误过不了解释器的检测,必须要在执行前改正 二是逻辑错误,在执行的时候检测出了错误. 2 什么是异常:异常就是程序在运行是产生的错误信息. 3 异常的种类 python3中不同的异常分为不同的类型,用不同的类型去标识.不同的类型对象错误都有相对应的标识语法. AssertionErr: 断言语句失败:关键字后边的条件为假的时候,程序将 停止并抛出AssertionError异常,语句一般是在测试程序的时候用于在代码中置入的检查点.

走入计算机的第三十天(继承实现原理和封装)

一 继承的实现原理 1 继承的实现顺序 从左到有依次查找,     每一个分支查找完了才进行下一个分支的查找 在新式类中每个分支属于同一个父类的时候查找的顺序是如下 这种属于广度优先,就是在新式类中,查找从左到右每个分支依次查找完毕过后,最后在查找他们共同的父类. 在经典类中每个分支属于同一个父类的时候查找的顺序是如下 这种属于深度查找,就是在经典类中,从左到右,每个分支查找到底,在进行下一个分支的查找,但是在他们共同父类第一次查找过后,就不会在查找他们共同的父类了. 1 class A(obj

走入计算机的第三十四天(基于tcp和udp的套接字)

一 TCP套接字 1 low版TCP套接字 服务器端 客户端 2.改进版tcp套接字 服务端 客户端 二.UDP的套接字 服务器 客户端 注:udp的套接字可以支持多个客户端同时访问,但tcp套接字就不行了,那是因为tcp套接字有tcp三次握手四次挥手. 三.recv和recvfrom的区别? 1.提前须知: 1.1tcp是send发送消息,recv接收消息. 1.2udp是sendto发送消息,recvfrom接收消息. 1.3 在我眼里看来send只是发送一个数据对象,所以recv接收的也只

走入计算机的第三十一天(多态和绑定方法)

一 多态和多态性 1 什么是多态:多态就是一种失误的多种形态.(例如:水有冰的形态,还有水蒸气的形态等等)一个抽象类有多个子类,因而多态的概念依赖于继承. 序列类型有多种形态:字符串,列表,元组. 动物有多种形态:人,狗,猪 1 import abc 2 class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 3 @abc.abstractmethod 4 def talk(self): 5 pass 6 7 class People(Animal): #动