进程
简介
操作系统分配资源的基本单位
创建
依赖
- 依赖模块
multiprocessing
中的Process
语法
Process(group[,target[,name[,args[,kwargs]]]])
- target:如果传递了函数的引用,这个子进程就执行这里的代码
- args:元组的方式传递,顺序保持一致,一个时得有逗号
- kwargs:对象的方式传递参数,key 需要和参数名称保持一致
- name:设定一个名字,可以不设定
- group:指定进程组
方法
- start():启动子进程实例(创建子进程)
- is_alive():判断子进程是否存活
- join([timeout]):是否等待子进程执行结束,或等待多少秒
- terminate():不管任务是否完成,立即终止子进程
属性
- name:当前进程的别名,默认process-N,N为从1开始递增的整数
- pid:当前进程的pid(进程号)
状态
- 就绪态:运行的条件都具备,正在等待cpu执行
- 执行态:cpu正在执行其功能
- 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待状态
案例
创建进程
- 代码
from multiprocessing import Process
import time
def sing(name, age):
time.sleep(2)
print('唱歌者姓名:' + name + ',年龄:' + str(age))
print('正在唱歌...')
def dance(name, age):
print('跳舞者姓名:' + name + ',年龄:' + str(age))
print('正在跳舞...')
if __name__ == '__main__':
# 构建两个进程
p1 = Process(target=sing, args=('张学友', 30))
p2 = Process(target=dance, kwargs={'name': '谢霆锋', 'age': 25})
# 启动两个进程
p1.start()
p2.start()
- 运行
发现问题
- 先 start 的唱歌进程, 可结果输出确先是跳舞
- 想想应该和线程类似,默认异步执行
解决问题
join(timeout) : 等待子进程执行完毕
- 代码
from multiprocessing import Process
import time
def sing(name, age):
time.sleep(2)
print('唱歌者姓名:' + name + ',年龄:' + str(age))
print('正在唱歌...')
def dance(name, age):
print('跳舞者姓名:' + name + ',年龄:' + str(age))
print('正在跳舞...')
if __name__ == '__main__':
# 构建两个进程
p1 = Process(target=sing, args=('张学友', 30))
p2 = Process(target=dance, kwargs={'name': '谢霆锋', 'age': 25})
# 启动两个进程
p1.start()
p1.join()
p2.start()
p2.join()
print('主进程结束')
- 运行
自定义名称
- 代码
from multiprocessing import Process
import time
def sing(name, age):
time.sleep(2)
print('唱歌者姓名:' + name + ',年龄:' + str(age))
print('正在唱歌...')
def dance(name, age):
print('跳舞者姓名:' + name + ',年龄:' + str(age))
print('正在跳舞...')
if __name__ == '__main__':
# 构建两个进程
p1 = Process(name='P-sing', target=sing, args=('张学友', 30))
p2 = Process(name='P-dance', target=dance, kwargs={'name': '谢霆锋', 'age': 25})
# 启动两个进程
p1.start()
print("进程名称:" + p1.name + " ,是否存活:" + str(p1.is_alive()))
p1.join()
print("进程名称:" + p1.name + " ,是否存活:" + str(p1.is_alive()))
p2.start()
print("进程名称:" + p2.name + " ,是否存活:" + str(p2.is_alive()))
p2.join()
print("进程名称:" + p2.name + " ,是否存活:" + str(p2.is_alive()))
print('主进程结束')
- 运行
资源不共享
案例:
- 读写两个进程
- 写进程往全局变量数组中添加元素
- 等写进程执行完毕后,再开启读进程
- 代码
from multiprocessing import Process
import time
def write():
for i in range(5):
li.append(i)
time.sleep(1)
print('写入的数据:', li)
def read():
print('读取的数据:', li)
li = []
if __name__ == '__main__':
# 构建两个进程
w = Process(name='P-W', target=write)
r = Process(name='P-R', target=read)
# 启动两个进程
w.start()
w.join() # 等待写入完成后再去读取
r.start()
- 运行