1 2 Fork me on GitHub 6

python 多进程详细总结

多进程:是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。

特征:

  • 动态性:进程的实质是程序在多任务系统中的一次执行过程,进程是动态产生,动态消亡的。
  • 并发性:任何进程都可以同其他进程一起并发执行
  • 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
  • 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度执行
  • 结构特征:进程由程序、数据和进程控制块三部分组成。
  • 多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。

python中多进程模块multiprocessing的基本使用:

创建并开启进程的两种方法:

#方法一 直接调用import time
import random
from multiprocessing import Process
def run(name):
    print('%s runing' %name)
    time.sleep(random.randrange(1,5))
    print('%s running end' %name)


'''
创建三个进程
target表示调用对象,即子进程要执行的任务
args表示调用对象的位置参数元组,args=(1,2,'anne',)
'''
p1=Process(target=run,args=('anne',))   
p2=Process(target=run,args=('alice',))
p3=Process(target=run,args=('biantai',))
p4=Process(target=run,args=('haha',))

p1.start()
p2.start()
p3.start()
p4.start()
print('主进程')
#方法二 继承式调用
import time
import random
from multiprocessing import Process


class Run(Process):
    def __init__(self,name):
        super().__init__()
        self.name=name
    def run(self):
        print('%s runing' %self.name)
        time.sleep(random.randrange(1,5))
        print('%s runing end' %self.name)

p1=Run('anne')
p2=Run('alex')
p3=Run('ab')
p4=Run('hey')
p1.start() #start会自动调用run
p2.start()
p3.start()
p4.start()
print('主进程')

注:上述代码的运行顺序是启动程序时主进程随之启动,接下来主进程负责创建3个子进程,3个子进程去分别执行自己的任务,此时主进程会继续往下走,但有的时候我们需要子进程任务结束之后才让主进程往下走,此时我就需要让主进程等待子进程完成任务后再往下走。此时就用到了join(), 例如:

import time
import random
from multiprocessing import Process


class Run(Process):
    def __init__(self,name):
        super().__init__()
        self.name=name
    def run(self):
        print('%s runing' %self.name)
        time.sleep(random.randrange(1,5))
        print('%s runing end' %self.name)

p1=Run('anne')
p2=Run('alex')
p3=Run('ab')
p4=Run('hey')
p1.start() #start会自动调用run
p2.start()
p3.start()
p4.start()
p1.join() #等待p1进程停止
p2.join()
p3.join()
p4.join()
print('主线程')

#注意上面的代码是主进程等待子进程,等待的是主进程,所以等待的总时间是子进程中耗费时间最长的那个进程运行的时间

#上述启动进程与join进程可以简写为
# p_l=[p1,p2,p3,p4]
# 
# for p in p_l:
#     p.start()
# 
# for p in p_l:
#     p.join()

主进程等待子进程结束

进程之间不共享全局变量:

import os
from multiprocessing import Process

a = 100
def run():
    print("子进程正在执行pid为{}".format(os.getpid()))
    global a
    a += 100
    print("子进程执行结束a的值为{}".format(a))

if __name__ == '__main__':
    p=Process(target=run)
    p.start()
    p.join()
    print("父进程{}执行结束a的值为{}".format(os.getppid(),a))

    '''
      结果:
            子进程正在执行pid为57822
            子进程执行结束a的值为200
            父进程16504执行结束a的值为100
      '''

posted @ 2020-07-22 14:35  peng_li  阅读(716)  评论(0编辑  收藏  举报
1