我们的目标是:通过这一套资料学习下来,可以熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。
上篇文章我们讨论了turtle库绘制图画操作的相关知识。今天学习一下进程的概念和创建方法。
1、什么是进程
在了解进程之前,我们先明确一下多任务的概念。多任务,是指操作系统执行多个任务。例如我们的计算机打开了音乐、浏览器、电影等,这时就是多任务运行。
上面说的每一个任务就是一个进程。所以,进程就是指计算机中已运行程序的实体。
进程和程序的不同之处在于:程序本身是指指令、数据、及其组织形式的描述。进程是程序真正运行实例。例如没有打开微信之前是程序,打开运行就开启了一个进程。如下图打开任务管理器,查看所示进程:
2、使用multiprocessing创建进程
1)创建进程的方法
multiprocessing 模块提供了Process 类来代表一个进程对象,语法格式:
Process(group,target,name,args,kwargs)
参数说明:group ----参数未使用,值始终是None
target:表示当前进程启动时执行的可调用对象,子程序要执行的任务
args:表示传递给target函数的参数(要用元组)
kwargs:表示传递给target函数的参数字典
name:表示当前进程实例的别名,子进程多的名称
举例说明:实例化进程,执行子进程
#创建子进程的例子
from multiprocessing import Process
#执行子进程
def mytest(interval):
print("i am a child process!")
#执行主程序
def main():
print("i am farther process!")
p = Process(target=mytest,args=(1,),name="p1-mytest") #实例化Process 进程类
p.start() #启动进程实例,即创建子进程
print("farther process finish")
if __name__ == "__main__":
main()
输出参考:
上面的例子中,p.start()#启动进程实例,即创建子进程,开始执行mytest()函数。
2)操作进程常用方法
除了这个start()方法以外,Process 的实例还有以下方法:
start():启动子进程,调用默认的run()
run():表示进程的运行方式。如果没有给定target 参数,对这个对象调用start()方法时,则将执行对象中的run()方法;
name:当前进程实例的名字,默认时Process-N,N 为从1开始递增的整数;
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
import time
from multiprocessing import Process
#两个子进程调用的方法
def child_1(interval):
print("子进程(%s)开始执行,父进程为(%s)"%(os.getpid(),os.getppid())) #打印子进程pid,父进程pid
t_start = time.time() #计时开始
time.sleep(interval) #程序将会被挂起interval 秒
t_end = time.time() #计时结束
print("子进程(%s)执行时间为'%0.2f'秒"%(os.getpid(),t_end-t_start)) #子进程执行时间
def child_2(interval):
print("子进程(%s)开始执行,父进程为(%s)"%(os.getpid(),os.getppid())) #打印子进程pid,父进程pid
t_start = time.time() #计时开始
time.sleep(interval) #程序将会被挂起interval 秒
t_end = time.time() #计时结束
print("子进程(%s)执行时间为'%0.2f'秒"%(os.getpid(),t_end-t_start)) #子进程执行时间
#执行主程序
def main():
print("********父进程执行开始********")
print("父进程的PID:%s"%os.getpid()) #输出当前程序的pid
process1 = Process(target=child_1,args=(1,)) #实例化进程1
process2 = Process(target=child_2,name='p2name',args=(2,))#实例化进程2
process1.start() #启动进程1
process2.start() #启动进程2
#父进程继续执行,如果子进程还在执行则返回True
print("process1.is_alive=%s"%process1.is_alive())
print("process2.is_alive=%s"%process1.is_alive())
#输出子进程的别名和PID
print("process1.name=%s"%process1.name) #按照默认设定的名字,展示Process-1
print("process1.pid=%s" % process1.pid)
print("process2.name=%s" % process2.name) #按照我们设定的名字,展示p2name
print("process2.pid=%s" % process2.pid)
print("********等待子进程********")
process1.join()#等待子进程1结束
process2.join()
print("********父进程执行结束********")
if __name__=="__main__":
main()
黄色部分等待子进程执行结束,然后继续执行父进程,参考执行结果:
今天先写学习到这里了,每天进步一点点。明天也要加油啊!