博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
开启进程 守护进程
阅读量:5162 次
发布时间:2019-06-13

本文共 6634 字,大约阅读时间需要 22 分钟。

一:开启进程的方式 第一种

from multiprocessing import Processimport timedef task(name):    print(f"{name} is running ")    time.sleep(3)    print(f"{name} is gone")if __name__ == '__main__':    p = Process(target = task,args = ('常鑫',))    p.start()    print('===主')            ===主常鑫 is running 常鑫 is gone

开启进程的方式 第二种

from multiprocessing import Processimport timeclass MyProcess(Process):    def __init__(self,name):        super().__init__()        self.name =name    def run(self):        print(f"{self.name} is running")        time.sleep(2)        print(f"{self.name} is gone")if __name__ == '__main__':    p = MyProcess('常鑫')    p.start()    print('=====主')'''=====主常鑫 is running常鑫 is gone'''

开启进程的简单应用

串行的执行结果

from multiprocessing import Processimport timedef task(name):    print(f"{name} is running")    time.sleep(1)    print(f"{name} is gone")def task1(name):    print(f"{name} is rinning")    time.sleep(2)    print(f"{name} is gone")def task2(name):    print(f"{name} is running")    time.sleep(3)    print(f"{name} is gone")if __name__ == '__main__':    p1 = Process(target = task ,args = ('常鑫',))    p2 = Process(target = task,args = ('李业',))    start_time = time.time()    #  一个进程串行的执行三个任务    task('常鑫')    task1('李业')    task2('海狗')    print(f"子进程:{time.time() - start_time}")''''常鑫 is running常鑫 is gone李业 is rinning李业 is gone海狗 is running海狗 is gone子进程:6.009300947189331

三个程序并发或者并行的执行三个任务

from multiprocessing import Processimport timedef task(name):    print(f"{name} is running")    time.sleep(1)    print(f"{name} is gone")def task1(name):    print(f"{name} is rinning")    time.sleep(2)    print(f"{name} is gone")def task2(name):    print(f"{name} is running")    time.sleep(3)    print(f"{name} is gone")if __name__ == '__main__':    p1 = Process(target = task ,args = ('常鑫',))    p2 = Process(target = task,args = ('李业',))    start_time = time.time()    p1.start()    p2.start()    task2('海狗')    print(f"结束时间{time.time() - start_time}")''''海狗 is running常鑫 is running李业 is running常鑫 is gone李业 is gone海狗 is gone结束时间3.014525890350342'''

验证昨天的结论 :

  1. 子进程必须依赖于主进程
  2. 子进程 copy 了主进程
  3. 子进程开辟进程,开销比较大,所以开的比较慢

二 : 进程 pid

如何区分内存中的这些进程?

命令获取所有进程的 pid windows 是 tasklist Mac是ps aux

image-20190820112520064

还有一个 ps — ef

image-20190820113120105

代码级别获取 pid
import osprint(os.getpid())
如何获取父进程
import osprint(os.getppid())

image-20190820113529916

三 : 验证进程之间的空间隔离

不可变数据类型的时候

from multiprocessing import Processimport timeimport osname = '太白'def task():    global name    name = "刚子sb"    print(name)if __name__ == '__main__':    p = Process(target = task)    p.start()    time.sleep(3)        # 睡了一下,所以先执行子进程    print(f"主:{name}")#  不可变数据类型时,子进程和父进程之间是隔离的,二者毫不影响# 刚子sb# 主:太白

我们来看一下可变数据类型

无论子进程中如何操作,在主进程中都是不变的

from multiprocessing import Processimport timelst = ['丽丽']def task():    lst.append("怼姐")    print(f"子进程{lst}")if __name__ == '__main__':    p = Process(target = task)    p.start()    # time.sleep(3)       # 加不加这个结果  完全不同 加了这个先输出子进程    print(f'主{lst}')        子进程['丽丽', '怼姐']主['丽丽']

总结:无论是可变数据类型,还是不可变数据类型,子进程的操作对主进程都没有影响

四 : join : 让主进程等待子进程执行结束,再执行主进程

这个怎么说呢? join 就是阻塞主进程有 join 主进程下方的代码一律不执行,直到执行完毕,但是一定切记,在开始的时候是并发的,消耗的时间也是记录在这个里面

from multiprocessing import Processimport timedef task(name):    print(f"{name} is running")    time.sleep(2)    print(f"{name} is gone")if __name__ == '__main__':    p = Process(target = task,args = ('魏无羡',))    p.start()    p.join()    print('===主')'''魏无羡 is running魏无羡 is gone===主'''先执行子进程,然后再执行主进程

多个子进程使用 join

from multiprocessing import Processimport timedef task(name,sec):    print(f"{name} is running")    time.sleep(1)    print(f'{name} is gone')if __name__ == '__main__':    start_time = time.time()    p1 = Process(target = task,args = ('魏无羡',1))    p2 = Process(target = task,args = ('蓝忘机',2))    p3 = Process(target = task,args = ('蓝曦臣',3))    p1.start()    p2.start()    p3.start()    print(f"主进程:{time.time() - start_time}")''''魏无羡 is running主进程:0.009562253952026367  只是主进程运行的时间蓝忘机 is running蓝曦臣 is running魏无羡 is gone蓝忘机 is gone蓝曦臣 is gone'''

下面的两个验证要好好弄明白

验证一

from multiprocessing import Processimport timedef task(name,sec):    print(f"{name} is running")    time.sleep(1)    print(f'{name} is gone')if __name__ == '__main__':    start_time = time.time()    p1 = Process(target = task,args = ('魏无羡',1))    p2 = Process(target = task,args = ('蓝忘机',2))    p3 = Process(target = task,args = ('蓝曦臣',3))    p1.start()    p2.start()    p3.start()    p1.join()    p2.join()    p3.join()    print(f"主进程:{time.time() - start_time}")    '''魏无羡 is running蓝忘机 is running蓝曦臣 is running魏无羡 is gone蓝忘机 is gone蓝曦臣 is gone主进程:1.0214881896972656'''

验证二

from multiprocessing import Processimport timedef task(name,sec):    print(f'{name}is running')    time.sleep(sec)    print(f'{name} is gone')if __name__ == '__main__':    start_time = time.time()    p1 = Process(target=task,args=('常鑫',1))    p2 = Process(target=task,args=('李业',2))    p3 = Process(target=task,args=('海狗',3))    p1.start()    p2.start()    p3.start()    # join就是阻塞    p1.join()      print(f'==主1:{time.time()-start_time}')    p2.join()    print(f'===主2:{time.time()-start_time}')    p3.join()    print(f'==主3:{time.time()-start_time}')      '''常鑫is running李业is running海狗is running常鑫 is gone==主1:1.0072300434112549李业 is gone===主2:2.0071139335632324海狗 is gone==主3:3.0082600116729736'''

当然还有精简代码

from multiprocessing import Processimport timedef task(sec):    print(f'is running')    time.sleep(sec)    print(f' is gone')if __name__ == '__main__':    start_time = time.time()    l1 = []    for i in range(1, 4):        p = Process(target=task,args=(i,))        l1.append(p)        p.start()    for i in l1:        i.join()    print(f'==主{time.time()-start_time}')'''is runningis runningis running is gone is gone is gone==主3.013340950012207'''

五 : 进程的其他参数

terminate 还有p.is_alive( ) 没被杀死返回 True 杀死之后返回 False

image-20190820175020645

执行这个杀死的进程,加睡眠时间 或者是 join 给点缓存时间

image-20190820175129458

args 默认返回值: Process-1

from multiprocessing import Processimport timedef task(name):    print(f'{name} is running')    time.sleep(2)    print(f'{name} is gone')if __name__ == '__main__':    p = Process(target=task,args=('常鑫',),)  # 加上返回的就是 alex  不加返回的是Process-1    p.start()    print(p.name)    print('==主开始')

六 : 守护进程

守护进程:古时候 太监守护这个皇帝,如果皇帝驾崩了,太监直接也就死了.子进程守护着主进程,只要主进程结束,子进程跟着就结束,
from multiprocessing import Processimport timedef task(name):    print(f'{name} is running')    time.sleep(2)    print(f'{name} is gone')if __name__ == '__main__':    # 在windows环境下, 开启进程必须在 __name__ == '__main__' 下面    p = Process(target=task,args=('常鑫',))  # 创建一个进程对象    p.daemon = True  # 将p子进程设置成守护进程,只要主进程结束,守护进程马上结束.    p.start()    # p.daemon = True  # 一定要在子进程开启之前设置    time.sleep(1)    print('===主')'''常鑫 is running===主'''

转载于:https://www.cnblogs.com/hualibokeyuan/p/11384612.html

你可能感兴趣的文章
CF1088F Ehab and a weird weight formula
查看>>
[SCOI2012]喵星球上的点名——堪称十种方法做的题
查看>>
ios 友盟统计
查看>>
java 文件读写
查看>>
SSH密钥对登录的原理和实践
查看>>
0423上课练习(list、while、def)
查看>>
ruby获取最新ruby
查看>>
ABAP术语-Object Type
查看>>
构建arm-linux-gnueabi-gcc-4.6.3交叉编译链
查看>>
通过shell脚本进行数据库操作
查看>>
【转】数据库中的join
查看>>
重置BizTalk RosettaNet
查看>>
Android-MeasureSpec那些事
查看>>
MVC设计模式思想及简单实现
查看>>
java面试题(晨星)
查看>>
vlc-0.9.8a的plugins详解
查看>>
Java编程基础阶段笔记 day01 Java语言概述
查看>>
DEV GridControl 获取选中行的数据
查看>>
斐波那契_尾递归
查看>>
web.config 配置
查看>>