开启进程 守护进程

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

from multiprocessing import Process
import time
def 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 Process
import time
class 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 Process
import time
def 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 Process
import time
def 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

还有一个 ps — ef

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

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

不可变数据类型的时候

from multiprocessing import Process
import time
import os
name = '太白'
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 Process
import time
lst = ['丽丽']
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 Process
import time
def 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 Process
import time
def 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 Process
import time
def 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 Process
import time

def 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 Process
import time

def 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 running
is running
is running
 is gone
 is gone
 is gone
==主3.013340950012207
'''

五 : 进程的其他参数

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

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

args 默认返回值: Process-1

from multiprocessing import Process
import time

def 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 Process
import time

def 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

时间: 2024-10-04 19:49:32

开启进程 守护进程的相关文章

开启子进程的两种方式,孤儿进程与僵尸进程,守护进程,互斥锁,IPC机制,生产者与消费者模型

开启子进程的两种方式 # # # 方式一: # from multiprocessing import Process # import time # # def task(x): # print('%s is running' %x) # time.sleep(3) # print('%s is done' %x) # # if __name__ == '__main__': # # Process(target=task,kwargs={'x':'子进程'}) # p=Process(tar

菜鸟随笔(3)---三种进程学习.孤儿进程.僵尸进程.守护进程

一只菜鸟横空出世,码农世界闯一闯,每天进展多一丢丢. 三种进程学习.孤儿进程.僵尸进程.守护进程 转自https://blog.csdn.net/believe_s/article/details/77040494 1.孤儿进程 如果父进程先退出,子进程还没退出那么子进程将被 托孤给init进程,这里子进程的父进程就是init进程(1号进程).其实还是很好理解的. // 父进程先子进程退出 // 子进程会被祖父进程接手并在后台运行,执行内部的代码 int main() { pid_t pid =

并发编程 之 进程 之 进程的模型: 进程同步的工具 (三) 继 创建进程( 守护进程)

multiProcessing 包中 Process模块: join() 堵塞问题, 可以理解为:  相当于 每个子进程结束时都会给 父进程发一条消息, join() 则是接收,内部有socket的实现 1, 进程之间的数据隔离问题 进程和进程之间的数据是隔离的, 内存空间不能共享,所以要想进行通信, 必须借助其他方法. 且这两个进程都是自愿的. 父子进程之间通过socket 通信. 2, 守护进程: daemon = True 守护进程的属性, 默认是 False 如果 设置成True 就表示

[Linux] PHP程序员玩转Linux系列-使用supervisor实现守护进程

1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转Linux系列-备份还原MySQL 5.PHP程序员玩转Linux系列-自动备份与SVN 6.PHP程序员玩转Linux系列-Linux和Windows安装nginx 7.PHP程序员玩转Linux系列-nginx初学者引导 8.PHP程序员玩转Linux系列-Nginx中的HTTPS 首先遇到的问题

PHP高级编程之守护进程,实现优雅重启

PHP高级编程之守护进程 http://netkiller.github.io/journal/php.daemon.html Mr. Neo Chen (陈景峰), netkiller, BG7NYT 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 +86 755 29812080 <[email protected]> 版权 ? 2014 http://netkiller.github.io 版权声明 转载请与作者联系,转载时请务必标明文章原始出处和

守护进程和supervisor

守护进程和supervisor 前言 接触守护进程已经很久了,但是在工作中有时候却经常忘记它.这次是在需要后台跑一个十几万的数据处理工作,耗时较长的时候,习以为常的通过&将脚本放到后台去执行,将标准输出和错误输出重定向到日志文件.然后干其他的事情,却发现进程莫名奇妙的死掉,即使已经在所有可能出现异常的地方都比较注意,然后在合适的地方加上了try except这样的异常处理.但是任何异常信息都没有打印,后来突然发现,有可能是因为仅仅是通过&后台去跑,但是却并没有让该处理进程成为守护进程脱离终

5.1.6 守护进程daemon

子进程设置为守护进程后,在主进程代码执行结束(而非进程退出)后,子进程就终止. 如果子进程没有设置为守护进程,那么主进程会等子进行结束才结束主进程. 1. 守护进程的设置必须在start前设置. 2. 守护进程无法再开启子进程. from multiprocessing import Process import time def work(n): time.sleep(n) print('守护进程.....') if __name__ == '__main__': p = Process(ta

20181229(守护进程,互斥锁,IPC,生产者和消费者模型)

一.守护进程 守护进程:一个进程B守护另一个进程A,当被守护的进程A结束,进程B也就结束了.(不一定同生,但会同死) 两个特点: ①守护进程会在主进程代码执行结束后就终止 ②守护进程内无法再开启子进程,否则抛出异常. 注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止 应用场景:如果主进程认为一旦自己结束,子进程也就没有继续运行的必要了,就可以将子进程设置为守护进程.(例如:qq正在调用自身的下载文件功能,但是此时退出了qq,下载进程也就可以直接关闭了) 方法为:process.d

守护进程,互斥锁,IPC,队列,生产者与消费者模型

小知识点:在子进程中不能使用input输入! 一.守护进程 守护进程表示一个进程b 守护另一个进程a 当被守护的进程结束后,那么守护进程b也跟着结束了 应用场景:之所以开子进程,是为了帮助主进程完成某个任务,然而,如果主进程认为自己的事情一旦做完了就没有必要使用子进程了,就可以将子进程设置为守护进程 例如:在运行qq的过程,开启一个进程,用于下载文件,然而文件还没有下载完毕,qq就退出了,下载任务也应该跟随qq的退出而结束. from multiprocessing import Process