multiprocessing模块-Process

multiprocessing模块-Process

# multiple  多元化的
# processing 进程
# multiprocessing 多元的处理进程的模块

仔细说来,multiprocess不是一个模块而是python中一个操作、管理进程的包。 之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的所有子模块。由于提供的子模块非常多,为了方便大家归类记忆,我将这部分大致分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享。

Process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。

import os
from multiprocessing import Process

def func():
    print(os.getpid(),os.getppid())
#     # pid process id           进程id
#     # ppid parent process id   父进程id
if __name__ == '__main__':
    print('main:',os.getpid(),os.getppid())
    p = Process(target=func)
    p.start()
    
#main: 824 1272
#1508 824
#同时开启多个子进程
import os
import time
from multiprocessing import Process

def func(name,age):
    print('%s start'%name)
    time.sleep(1)
    print(os.getpid(),os.getppid(),name,age)

if __name__ == '__main__':
    # 只会在主进程中执行的所有的代码你写在name = main下
    print('main :',os.getpid(),os.getppid())
    arg_lst = [('alex',84),('太白', 40),('wusir', 48)]
    for arg in arg_lst:
        p = Process(target=func,args=arg)
        p.start()  # 异步非阻塞
# join的用法
import os
import time
import random
from multiprocessing import Process

def func(name,age):
    print('发送一封邮件给%s岁的%s\n'%(age,name))
    time.sleep(random.random())
    print('发送完毕')

if __name__ == '__main__':
    arg_lst = [('大壮',40),('alex', 84), ('太白', 40), ('wusir', 48)]
    p_lst = []
    for arg in arg_lst:
        p = Process(target=func,args=arg)
        p.start()
        p_lst.append(p)
    for p in p_lst:p.join()
        
    print('所有的邮件已发送完毕')
#p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程 

开启进程的另一种方法

​ 面向对象的方法,通过继承和重写run方法完成了启动子进程
​ 通过重写init和调用父类的init完成了给子进程传参数

开启进程的另一种方式

class 类名(Process):
    def __init__(self,参数):
        self.属性名 = 参数
        super().__init__()
    def run(self):
        print('子进程要执行的代码')
p = 类名()
p.start()
import os
import time
from multiprocessing import Process

class MyProcess(Process):
    def __init__(self,a,b,c):
        self.a = a
        self.b = b
        self.c = c
        super().__init__()  

    def run(self):
        time.sleep(1)
        print(os.getppid(),os.getpid(),self.a,self.b,self.c)

if __name__ == '__main__':
    print('-->',os.getpid())
    for i in range(10):
        p = MyProcess(1,2,3)
        p.start()

Process类的一些其他方法\属性
name pid ident
terminate()# 强制结束一个子进程
isalive() 判断子进程是否还在运行

posted @ 2020-07-19 15:19  爱浪的跳蚤  阅读(153)  评论(0编辑  收藏  举报