Process-join-多道技术,进程分类,进程的状态,进程和线程的对比总结表

一、关于multiprocessing (关于进程的模块)模块Process方法

关于multiprocess包的介绍:
multiprocess该包中几乎包含了和进程有关的所有子模块。是python中一个操作、管理进程的包。 multi是取自multiple的多功能的意思,
由于提供的子模块非常多,为了方便记忆,我将这部分大致分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享
process模块介绍:
    process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。
    强调:
    1. 需要使用关键字的方式来指定参数
    2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
参数介绍:
targe:表示调用对象,即子进程要执行的任务
args:表示调用对象的位置参数元组,args=(1,"engo")
kwargs:表示调用对象的字典,kwargs={"name":"egon",,"age":18}
方法介绍: p.start() 启动进程,并调用该子进程中的p.run() p.run() 进程启动时运行的方法,正是他去调用target指定的函数,我们自定义类的类中必须重新定义. p.join([timeout]) 主线程等待p终止(是主线程处于等的状态,而p是处于运行的状态),timeout是可选的超时时间.
 
p.name() #进程的名字
from multiprocessing import Process
import time
def f1(): time.sleep(3) print("123") def f2(): time.sleep(3) print("撒拉嘿") #windows系统下,必须在代码中写main,否则会出现递归开启进程,报错(在系统创建一个子进程时,会import这个主进程的所有代码) if __name__ == '__main__': p1 = Process(target = f1,) #创建进程对象 p2 = Process(target = f2,) #创建进程对象
p1.start() #给操作系统发送创建进程信号,后续进程的执行则由操作系统来决定 p2.start()

 Process方法传参的方式(常用):

from multiprocessing import Process
def f1(n):
    print(n)
if __name__ == '__main__':
    # p1 = Process(target=f1,args=('大力与奇迹',)) #创建进程对象,第一种传参方式
    p1 = Process(target=f1,kwargs={'n':'大力'}) #字典key必须跟函数的形参名一致.创建进程对象,第二种传参方式
    p1.start()  #给操作系统发送了一个创建进程的信号,后续进程的创建都是操作系统的事儿了

 Process方法传参的第二种方式,自己定义类时>>>:

class MyProcess(Process):
    def __init__(self,n):#自己定义的类,必须继承Process
        super().__init__()  #必须执行父类的init
        self.n = n
    def run(self):  #必须重新定义run方法
        print('小黑and%s不可告人的事情'%self.n)
if __name__ == '__main__':
    p1 = MyProcess('小白')
    p1.start()

 二、关于join方法

join方法有什么用:

情况一:在主进程的任务与子进程的任务彼此独立的情况下,主进程的任务先执行完毕后,主进程还需要等待子进程执行完毕,然后统一回收资源

情况二:如果主进程的任务在执行到某一个阶段时,需要等待进程执行完毕后才能继续执行,就需要有一种机制能够让主进程检测进程是否运行完毕,

在子进程执行完毕后才继续执行,否则一直在原地阻塞.

举个例子:for循环创建子进程,并且主进程等待所有子进程执行完毕,才执行

import time
from multiprocessing import Process
def f1():
    time.sleep(0.01)
    print('xxx')
if __name__ == '__main__':
    p_list = []
    #for循环创建子进程,并且主进程等待所有子进程执行结束,才继续执行
    for i in range(10):
        p = Process(target=f1,)
        p.start()
        p_list.append(p)
        # p.join() 
    for pp in p_list:
        pp.join()
    print('主进程结束')

 

三、多道技术:

产生的背景:多道技术产生的背景是第二代计算机的操作系统对cpu利用效率不高的状况

什么是多道技术:

  多道指的是多个程序,多道技术的实现是为了解决多个程序竞争或者说共享同一个资源(比如cpu)的有序调度问题,解决方式即多路复用,

  多路复用分为时间上和空间上的多路复用.

空间上的复用:

  将内存分为几部分,每个部分放入一个程序,这样,同一时间内存中就有多道程序.

时间上的复用:

  当一个程序i/o(阻塞)时,另一个程序可以使用cpu;一个进程占用cpu时间过长也会切换,或者说被操作系统夺走cpu的执行权限.

四、分时操作系统:

产生的背景:第二代计算机不能满足程序员们,在调试自己程序时,能很快可以得到响应.出现了分时操作系统.

什么是分时操作系统:

  多个联机终端+多道技术

  20个客户端同时加载到内存,有17个在思考,3个在运行,cpu就采用多道的方式处理内存中的这3个程序,由于客户提交的一般都是尖端的指令而且很少有耗时长的,

索引计算机能够为许多用户提供快速的交互式服务,所有的用户都以为自己独享了计算机的资源.

五、进程

什么是进程:

  程序的运行过程. 正在进行的一个过程或者说一个任务,而负责执行任务则是cpu

什么是并发:

  是伪并行,即:看起来是同时运行.(单个cpu+多道技术就可以实现并发)

什么是并行:

  同时运行,只有具备多个cpu才能实现并行.

六、操作系统如何实现的并发(了解即可)

    硬件中断一个正在运行的进程,把此时进程运行的所有状态保存下来,为此,操作系统维护一张表格,即进程表,每个进程占用一个进程表项(也称为进程控制块)

  以此来保存进程由运行态转为就绪态或阻塞态时,必须保存的信息,从而保证该进程再次启动时,就像从而被中断过一样.

七、进程状态

   在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞。

1.同步异步

所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。
     其实就是一个程序结束才执行另外一个程序,串行的,不一定两个程序就有依赖关系。 所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。
    至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。

 

2.阻塞与非阻塞

阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)
等待消息通知时的状态角度来说的

 

 3.同步/异步 与 阻塞和非阻塞

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 1 # 如何创建进程
 2 from multiprocessing import Process
 3 #如何创建线程                             #进程和线程除了导入的模块和函数不一样外,其他方法都一样,例如下指令运行start,还有传参时的Thread(target=f1,args=(1,))和Process(target=f1,args=(1,))
 4 from threading import Thread
 5 
 6 #如何创建进程池
 7 #1. from concurrent.futures import ProcessPoolExecutor
 8 #2. from multiprocessing import Pool
 9 #如何创建线程池               #创建进程池和线程池除了导入的模块和函数不一样,其他方法,指令都一样
10 from concurrent.futures import ThreadPoolExecutor
线程与进程总结

 

posted @ 2019-01-08 18:07  Tank-Li  阅读(307)  评论(0编辑  收藏  举报