Python进程multiprocessing.Process()的使用解读
|
1.进程概念
进程是资源分配的最小单位,程序隔离的边界。
CPU的时间片轮转,在不同的时间段切换执行不同的进程,但是切换进程是比较耗时的;就引来了轻量级进程,也就是所谓的线程,一个进程中包括多个线程(代码流,其实也就是进程中同时跑的多个方法体)
- 程序:例如xxx.py这是程序,是一个静态的
- 进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元。
2.进程的状态
工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态
- 就绪态:运行的条件都已经满足,正在等在cpu执行
- 执行态:cpu正在执行其功能
- 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态
3.进程的创建-multiprocessing
multiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情。
方法说明:
创建子进程跟创建线程十分类似,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动。
Process语法结构如下: Process([group [, target [, name [, args [, kwargs]]]]])
- target:如果传递了函数的引用,这个子进程就执行这里(函数)的代码
- args:给target指定的函数传递的参数,以元组的方式传递
- kwargs:给target指定的函数传递命名参数
- name:给进程设定一个名字,可以不设定 group:指定进程组,大多数情况下用不到
Process创建的实例对象的常用方法:
- start():启动子进程实例(创建子进程)
- is_alive():判断进程子进程是否还在活着
- join([timeout]):是否等待子进程执行结束,或等待多少秒
- terminate():不管任务是否完成,立即终止子进程
Process创建的实例对象的常用属性:
- name:当前进程的别名,默认为Process-N,N为从1开始递增的整数
- pid:当前进程的pid(进程号)
代码示例:- import multiprocessing
- import time
- def work1():
- for i in range(10):
- print("work1----", i)
- time.sleep(0.5)
- if __name__ == '__main__':
- # 创建进程
- # 1. 导入 multiprocessing 模块
- # 2. multiprocessing.Process() 创建子进程
- # 3. start() 方法启动进程
- p1 = multiprocessing.Process(group=None, target=work1)
- p1.start()
- for i in range(10):
- print("这是主进程", i)
- time.sleep(0.5)
复制代码
4.进程名称获取
multiprocessing.current_process()
5. 获取进程pid
有两种方法可以获取
1)multiprocessing.current_process().pid
2)使用import os模块的getpid()- import multiprocessing
- import time
- import os
- def work():
- # 获取进程的名称
- print(multiprocessing.current_process())
- # 获取进程的pid
- print(multiprocessing.current_process().pid, os.getpid())
- i = 0
- while i < 10:
- print("work中执行", i)
- time.sleep(0.5)
- i = i + 1
- if __name__ == '__main__':
- # 获取进程的pid
- print(multiprocessing.current_process())
- # 创建子进程
- process1 = multiprocessing.Process(group=None, target=work)
- process1.start()
- i = 0
- while i < 10:
- print("我在主线程中执行",i)
- time.sleep(0.3)
- i = i + 1
复制代码
获取父id: getppid() 获取父进程id
6.子进程参数传递
给子进程传递参数方法和给子线程传递参数方法基本一致!
7.进程间不共享全局变量
- import multiprocessing
- # 定义全局变量
- num = 100
- # 定义work方法,设置num1的值
- def work():
- global num # 在函数内部声明使用全局变量num
- num = num + 1 # 对num值进行+1
- print("work num = %d" % num)
- # 定义work2方法,获取num1的值
- def work2():
- print("work2 num = %d" % num)
- if __name__ == '__main__':
- # 创建子进程
- process1 = multiprocessing.Process(group=None, target=work, name="MyProcess")
- process1.start()
- # 创建第二个子进程
- process2 = multiprocessing.Process(group=None, target=work2, name="MyProcess2")
- process2.start()
复制代码 运行结果:- work num = 101work2 num = 100
复制代码 由运行结果可以看出,work函数对num1的修改,在work2中并没有获取到,而还是原来的100,所以,进程之间是不能够共享变量的
8.守护主进程
- import multiprocessing
- import time
- def sub_process():
- for i in range(10):
- print("子进程运行中", i)
- time.sleep(0.5)
- if __name__ == '__main__':
- # 创建子进程
- p1 = multiprocessing.Process(group=None, target=sub_process, name="p1")
- # 设置守护主进程
- # 第一种方式:
- # p1.daemon = True
- # 第二种方式(最好在退出exit()前一句使用):
- # p1.terminate()
- # 启动
- p1.start()
- time.sleep(2)
- print("OVER!")
- p1.terminate()
- exit()
复制代码 总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
来源:https://www.jb51.net/python/316258nc6.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|
|
|
发表于 2024-2-25 04:27:01
来自手机
举报
回复
分享
|
|
|
|