Python-进程
进程
简介
操作系统分配资源的基本单位
创建
依赖
- 依赖模块
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 timedef 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 timedef 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 timedef 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 timedef 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()
- 运行