进程执行控制简述
在多进程编程中,所有的进程都会按照既定的代码顺序执行,但是某些进程有可能需要强制执行,或者由于某些问题需要被中断,那么就可以利用Process类中提供的方法进行控制
具体方法
| No. |
方法 |
类型 |
描述 |
| 1 |
terminate(self) |
方法 |
关闭进程 |
| 2 |
is_alive(self) |
方法 |
判断进程是否存活 |
| 3 |
join(self,timeout) |
方法 |
进程强制执行 |
join()方法
所有的进程通过start()方法启动,而后多个进程进入到进程阻塞队列之中依次进行执行,那么这个时候某一个进程是不可能强占CPU资源的,但是如果说现在就是有进程很高级就必须强占,就可以通过join()来进行处理。
进程的强制运行
不加join()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import multiprocessing as mtp,time def send(msg): time.sleep(5) print("进程ID: %s、进程名称:%s" % ( mtp.current_process().pid, mtp.current_process().name))
def main(): process = mtp.Process(target=send,args=("www.yootk.com",),name="发送进程") process.start() print("[进程ID:%s、进程名称:%s]信息发送完毕..." % ( mtp.current_process().pid, mtp.current_process().name)) if __name__ == "__main__": main()
|
执行结果:(主进程先执行输出,等了5秒,子进程输出)
1 2 3 4 5
| D:\Program_software_list\Anaconda3_5\python.exe F:/Learn/Python/untitled1/test.py [进程ID:38552、进程名称:MainProcess]信息发送完毕... 进程ID: 30640、进程名称:发送进程
进程已结束,退出代码0
|
加上join()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import multiprocessing as mtp,time def send(msg): time.sleep(5) print("进程ID: %s、进程名称:%s" % ( mtp.current_process().pid, mtp.current_process().name))
def main(): process = mtp.Process(target=send,args=("www.yootk.com",),name="发送进程") process.start() process.join() print("[进程ID:%s、进程名称:%s]信息发送完毕..." % ( mtp.current_process().pid, mtp.current_process().name)) if __name__ == "__main__": main()
|
执行结果: (先等子进程中的5秒时间,然后子进程输出,然后主进程输出)
1 2 3 4 5
| D:\Program_software_list\Anaconda3_5\python.exe F:/Learn/Python/untitled1/test.py 进程ID: 28112、进程名称:发送进程 [进程ID:30780、进程名称:MainProcess]信息发送完毕...
进程已结束,退出代码0
|
此时子进程先执行完毕(如果子进程占用的时间较长,那么其它的进程也需要进行等待),当子进程全部执行完毕之后就会继续执行主进程的操作(子进程让出了资源给其它进程)。
进程的中断处理
所有进程除了强制执行之外实际上还可以进行中断处理,这个时候一般都会中断存活的进程,所以在中断之前一般对进程状态进行判断。
进程中断示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import multiprocessing as mtp,time def send(msg): time.sleep(5) print("进程ID: %s、进程名称:%s" % ( mtp.current_process().pid, mtp.current_process().name))
def main(): process = mtp.Process(target=send,args=("这是一个信息",),name="发送进程") process.start() time.sleep(2) if process.is_alive(): process.terminate() print("“%s”进程执行被中断..." % process.name)
if __name__ == "__main__": main()
|
运行结果:
1 2 3 4
| D:\Program_software_list\Anaconda3_5\python.exe F:/Learn/Python/untitled1/test.py “发送进程”进程执行被中断...
进程已结束,退出代码0
|
本来子进程在5秒后会输出信息,结果在2秒后被主进程给中断掉了
总结
所有通过Python创建的进程实际上都可以进行额外的处理控制,但是如果从实际的开发中来讲,很少会出现这样强制性的霸占或者中断。(join:其它进程无法执行;中断:数据将有可能丢失)