多进程,守护进程,锁

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

一:多进程

import os
import time
from multiprocessing import Process
def func(args,args2):print(args,args2)#打印参数time.sleep(3)
    print('子进程 :',os.getpid())  #查看子进程进程号print('子进程的父进程 :',os.getppid())#查看子进程的父进程,多了一个pprint(12345)

if __name__ =='__main__':p =Process(target=func,args=('参数','参数2'))   # 注册# p是一个进程对象,还没有启动进程p.start()       # 开启了一个子进程print('*'*10)
    print('父进程 :',os.getpid()) # 查看当前进程的进程号print('父进程的父进程 :',os.getppid()) # 查看当前进程的父进程
# 进程的生命周期# 主进程# 子进程# 开启了子进程的主进程 :# 主进程自己的代码如果长,等待自己的代码执行结束,# 子进程的执行时间长,主进程会在主进程代码执行完毕之后等待子进程执行完毕之后 主进程才结束

打印结果: 先打印主进程,然后打印子进程。主进程结束执行子进程。

**********
父进程 : 3832
父进程的父进程 : 2556
参数 参数2
子进程 : 5416
子进程的父进程 : 3832
12345

 

二:多进程的中的几个方法(多进程即可指子进程,父进程这两个进程,也可指多个实例化两个进程)

import time
from multiprocessing import Process

def func(arg1,arg2):print('*'*arg1)
    time.sleep(5)
    print('*'*arg2)

if __name__ =='__main__':p =Process(target=func,args=(10,20))
    p.start()
    print('hahahaha')
    # p.join()     # 是感知一个子进程的结束,将异步的程序改为同步print('====== : 运行完了')

这样就是正常打印,主进程执行完毕执行子进程

hahahaha
====== : 运行完了
**********
********************

 

如果加上join之后,是感知一个子进程的结束,将异步的程序改为同步。也就是等待子进程结束后主进程关闭

打印结果:

hahahaha
**********
********************
====== : 运行完了

如果子进程是一个while循环的死循环,那么主进程就一直不会关闭。

import os
import time
from multiprocessing import Process

def func():while True:print('子进程开始')
        time.sleep(1)
        print('***我还在运行')

if __name__ =='__main__':p =Process(target=func)
    p.daemon =True
    p.start()
    p.join()
    print('程序结束')

打印结果:

子进程开始
***我还在运行
子进程开始
***我还在运行

总是在子进程这里循环

 

小总结:

process小知识:

Process([group [,target [,name [,args [,kwargs]]]]]),由该类实例化得到的对象,
表示一个子进程中的任务(尚未启动)

强调:
1.需要使用关键字的方式来指定参数
2.args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号

参数介绍:
1group参数未使用,值始终为None
2target表示调用对象,即子进程要执行的任务
3args表示调用对象的位置参数元组,args=(1,2,'egon',)
4kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}
5name为子进程的名称

 

进程常见关键字

1p.start():启动进程,并调用该子进程中的p.run() 
2p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法  
3p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,
使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
4p.is_alive():如果p仍然运行,返回True
5p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。
timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程

 

开启多个子进程

import os
import time
from multiprocessing import Process

def func(filename,content):with open(filename,'w') as f:f.write(content*10*'*')

if __name__ =='__main__':p_lst =[]
    for i in range(10):p =Process(target=func,args=('info%s'%i,i))
        p_lst.append(p)
        p.start()
    for p in p_lst:p.join()   # 之前的所有进程必须在这里都执行完才能执行下面的代码print([i for i in os.walk(r'F:\python10期\day37\day37')])

# 同步 0.1 * 500  = 50# 异步 500 0.1    = 0.1# 多进程写文件# 首先往文件夹中写文件# 向用户展示写入文件之后文件夹中所有的文件名

解析:他会在所有进程结束之后才能完成下面的print。

 

开启多个子进程的第二种方式:

import os
from multiprocessing import Process

class MyProcess(Process):def __init__(self,arg1,arg2):super().__init__()
        self.arg1 =arg1
        self.arg2 =arg2

    def run(self):print(self.pid)
        print(self.name)
        print(self.arg1)
        print(self.arg2)

if __name__ =='__main__':p1 =MyProcess(1,2)
    p1.start()
    p2 =MyProcess(3,4)
    p2.start()

# 自定义类 继承Process类# 必须实现一个run方法,run方法中是在子进程中执行的代码

这种方式需要第一定义一个类,让他继承process,第二种是传参,需要初始化,然后是定义一个run方法,因为定义run方法之后才能执行start,然后在实例化二个对象。分别执行。

打印结果:

6356
MyProcess-1
1
2
3136
MyProcess-2
3
4

因为此进程是异步,所以process1和process2不确定谁最先打印,随机。super是执行process所有方法。

 

 

 

 

关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看