python之multiprocessing模块的Process
python之进程
概述:
python进程是程序中执行的程序,每个进程都有自己的地址空间。
进程:资源分配的最小单位。线程:程序执行的最小单位。协程:协程完全由程序所控制
在电脑程序中一般进程>线程>协程,进程中可以包含多个线程,线程中可以包含多个协程。
在执行多进程或多线程的时候,当cpu有多个核心的时候,那么进程间或线程间就是并行的。当cpu只有一个核心的时候,那么那么进程间或线程间就是并发的。
并发和并行
并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间
再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其他线程处于挂起状。这种方式我们称之为并发
并行:当系统有一个以上CPU时,则线程操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占
Multiprocess.Process模块
process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。
def task():
print("task")
if __name__=="__main__":
p = Process(target=task) #注意不要调用成task()函数
p.start()
Process的参数和方法
参数
group:表示线程组,默认为None
target:表示调用对象,子程序要执行的任务
args:表示调用位置的参数(要用元组)
kwargs:表示调用对象的字典
name:子进程多的名称
方法
start():启动子进程,调用默认的run()
run():表示进程的运行方式。
name:进程的名字
terminate:强制子程序终止进程
is_alive():判断子程序是否还存货
daemon:表示守护进程,默认值是False,当设置为Ture时,当父进程结束时,它会尝试终止其所有守护进程子。必须在start()之前设置。
join([timeout]):timeout默认值时None,该方法为阻塞,在调用join的子进程结束后才开始后面的代码,如果timeout有设定值,join会阻塞设定的时间才开始后面的代码
pid:返回进程的ID。用os模块的os.getppid()是返回主进程的ID,os.getpid()是返回当前进程的ID。
exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可)
示例:
import os
from multiprocessing import Process
import time
def task(args):
print('子进程开始%s,子进程的id:%s和父id:%s'% (time.time(),os.getpid(),os.getppid()))
time.sleep(args)
print('子进程结束%s'%time.time())
if __name__=="__main__":
p = Process(target=task,name="task",args=(1,))
p.start()
p.join()
print("子进程结束",p.is_alive())
print('主进程结束')
结果:
子进程开始1692500910.6039252,子进程的id:348和父id:12076
子进程结束1692500911.6121373 #sleep睡了三秒
子进程结束 False #因为join,所以在子进程结束后才执行
主进程结束
自定义进程
自定义进程可以设定一个类继承父类Process,如果有默认属性要求,自己写的__init__(self)
会将父类的__init__
覆盖,为了不丢失父类的一些属性,需要用super()加载
注意:在自定义进程中,必须要有run()函数。
示例:
import os
import time
from multiprocessing import Process
class MyProcess(Process):
def __init__(self, value):
super(MyProcess, self).__init__()
self.value = value
def run(self): #run()是Process类专门留出来让你重写的接口函数
self.task1()
self.task2()
def task1(self):
print("task1" + '子进程开始%s,子进程的id:%s和父id:%s' % (time.time(), os.getpid(), os.getppid()))
def task2(self):
print("task2" + '子进程开始%s,子进程的id:%s和父id:%s' % (time.time(), os.getpid(), os.getppid()))
if __name__ == "__main__":
p = MyProcess(2)
p.start()
p.join()
print('主进程结束')