py并发_进程控制笔记

进程执行控制简述

在多进程编程中,所有的进程都会按照既定的代码顺序执行,但是某些进程有可能需要强制执行,或者由于某些问题需要被中断,那么就可以利用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
# coding: UTF-8
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
# coding: UTF-8
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
# coding: UTF-8
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) #等待了两秒,让子进程先飞两秒,注意子进程中的5秒
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:其它进程无法执行;中断:数据将有可能丢失)


py并发_进程控制笔记
https://blog.wangxk.cc/2020/01/15/py并发-进程控制笔记/
作者
Mike
发布于
2020年1月15日
许可协议