Python高级——多进程(multiprocessing)

进程

程序:例如xxx.py这是程序,是一个静态的
进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元。
————目录————:

  • 进程的状态
  • 多进程的基本使用
  • 进程名称及pid获取
  • 参数传递
  • 全局变量
  • 守护进程

进程的状态

就绪态:运行的条件都已经满足,正在等在cpu执行
执行态:cpu正在执行其功能
等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态
这里写图片描述

多进程的基本使用

1.创建:

import  multiprocessing
对象 = multiprocessing.Process(group, target , name , args ,  kwargs)

2.参数:

参数 描述
target 如果传递了函数的引用,这个子进程就执行这里(函数)的代码
args 给target指定的函数传递的参数,以元组的方式传递
kwargs 给target指定的函数传递命名参数
name 给进程设定一个名字,可以不设定
group 指定进程组,大多数情况下用不到

3.方法:

方法 描述
start() 启动子进程实例(创建子进程)
is_alive() 判断进程子进程是否还在活着
join([timeout]) 是否等待子进程执行结束,或等待多少秒
terminate() 不管任务是否完成,立即终止子进程

4.属性:

参数 描述
name 当前进程的别名,默认为Process-N,N为从1开始递增的整数
pid 当前进程的pid(进程号)

进程名称及pid获取

1.进程名:

multiprocessing.current_process()

2.进程pid:

(1)multiprocessing.current_process().pid
(2)import os模块的os.getpid()
(3)获取父id:os.getppid()

参数传递

与多线程theading一致
1.元祖传参:args = (参数1,参数2,…)
注意:如果只有一个参数,应写为args=(参数,),逗号不可省略,证明他是一个元组
2.字典传参:kwargs = {“a”: 10, “b”:100,….}
3.混合使用:args = (参数1,), kwargs = {“b”:100,…….}

全局变量

进程之间不可共享全局变量
例:

import multiprocessing
import time
n = 0


def add():
    global n
    n += 1
    print(n)


if __name__ == '__main__':
    m1 = multiprocessing.Process(target=add)
    m2 = multiprocessing.Process(target=add)
    m1.start()
    time.sleep(0.5)
    m2.start()
    time.sleep(0.5)
    print(n)

执行结果:两次进程的操作结果都是1,而且最后n的值为0,说明主进程之间不共享全局变量(但是可通过消息队列Queue等进行数据的通信)
这里写图片描述

守护进程

设置后主进程结束时子进程也结束

# 第一种方法:主进程结束,子进程也结束
p1.daemon = True
# 第二种方法:让主进程立即结束
p1.terminate()

猜你喜欢

转载自blog.csdn.net/zsh142537/article/details/82555803