如何开启多进程及多进程相关常用方法

时间:2021-12-13 11:33:20

什么是进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

2 进程的两种开启方法
(1) p = Process(target=None,args(,))
(2) 自定义类,继承Process父类

3 进程的常用方法
(1) start() 开启一个子进程
(2) join() 异步变同步(就是让父进程停留在join这句话,等待子进程执行结束,父进程再继续执行)
(3) is_alive() 判断进程是否活着
(4) terminate() 杀死进程
4 进程的常用属性
(1) p.name = 给p进程一个名字
(2) p.pid 返回p进程的pid
(3) p.daemon = True 将p进程设置为守护进程。(True为守护进程,False为普通进程)

守护进程的两个特点:
随着父进程的代码执行完毕才结束
守护进程不能创建子进程
      守护进程必须要在start之前设置

并行:  指两者同时执行,比如有两条车道,在某一个时间点,两条车道上都有车在跑;(资源够用,比如三个线程,四核的CPU )

并发: 并发是指资源有限的情况下,两者交替轮流使用资源,比如只有一条车道(单核CPU资源),

     那么就是A车先走,在某个时刻A车退出把道路让给B走,B走完继续给A ,交替使用,目的是提高效率。

 

同步: 所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,

   这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。

异步: 不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,

   只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列

 

阻塞, 非阻塞:  阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的

 

开启子进程的方式:

# 先导入 multiprocessing中的Process
from multiprocessing import Process
import time
import os

def func1():
    time.sleep(1)
    # os.getpid() 获取当前进程的pid,os.getppid()获取当前进程的父进程的pid
    print('子进程:子进程的pid是%s,子进程的父进程是%s' % (os.getpid(),os.getppid()))

if __name__ == '__main__':
    p = Process(target=func1(),args=(1,))
    p.start()
    print('这里是父进程:父进程的pid是%s,父进程的父进程是%s' % (os.getpid(),os.getppid()))

 

进程的常用方法:  terminate, is_alive

from multiprocessing import Process
import time

# p.is_alive() 判断进程是否存活  
# p.terminate() 杀死p程序,让解释器告诉操作系统销毁p进程

def func1():
    time.sleep(1)
    print('子进程')


if __name__ == '__main__':
    p = Process(target=func1(),)
    p.start()
    print('子进程状态状态:', p.is_alive())
    p.terminate() # 杀死p进程,让解释器告诉操作系统销毁p进程
    time.sleep(2)
    print('子进程状态状态:',p.is_alive())

 

 进程的常用方法:  join方法 : 是让主进程等待子进程执行完

from multiprocessing import Process
import time

def func():
    for i in range(500):
        time.sleep(0.01)
        print('儿子在这里')

if __name__ == '__main__':
    p = Process(target=func)
    p.start()
    p.join()# 是让主进程等待子进程执行完。  现象:主进程执行到这句话,主进程阻塞住,等待子进程执行
    # time.sleep(1)
    for i in range(100):
        time.sleep(0.01)
        print('爸爸在这里')

# 开启一个正常的子进程,父进程会等待子进程结束后,父进程也就是程序才结束
# p.join()# 是让主进程等待子进程执行完。  现象:主进程执行到这句话,主进程阻塞住,等待子进程执行
# 如何把父进程和子进程之间的关系变为同步或者异步?
# 父进程执行join,就会变成同步,不执行join,父进程和子进程就是异步的关系
# join必须放在start()后边

 

进程常用属性: p.name p.pid p.daemon(守护进程)

 

from multiprocessing import Process
import os

def func():
    print('这里是子进程,子进程的pid是%s' % (os.getpid))

if __name__ == '__main__':
    p = Process(target=func())
    p.start()
    p.name = 'ben'
    print('子进程的名字为%s' % p.name)
    print('子进程的pid为%s' % p.pid)
    print('子进程是否为守护进程,%s' % p.daemon)

 

 

多进程之间无法共享内存
from multiprocessing import Process
def func(i):
    print('我是%s'%i)
    # global n
    print(n)


if __name__ == '__main__':
    n = 100
    addr = ['河南的','山东的','辽宁的','湖南的']
    for i in addr:
        p = Process(target=func,args=(i,))
        p.start()