fork()函数只能用于Linux、Unix系统之上,无法运行在Windows系统之上,这样就影响了Python的跨平台特性。因此需要利用另一个模块去创建进程,保证在各种平台上都能保证程序的正常运行。
所以我们现在通过Process去创建进程
1、利用Process创建进程
例:利用Process创建进程
使用Process之前,需要导入multiprocessing模块。
使用Process创建进程时,需要为target参数指定一个函数名,当执行到p.start()方法时,进程就会调用该函数名指向的函数,运行函数中的代码,直到函数结束。
2、Process调用带参数的函数
例:调用带参数的函数
如果Process的target参数调用的函数中带有参数,需要在Process初始化时,需要使用args参数,接收的类型为元组,其中的值会传递给target中的形参,进而完成带参数函数的调用。
如果函数只需要一个参数,直接赋值也可以,如果需要多个参数,则需要使用元组类型进行赋值。
上述创建Process的过程有一个弊端,Process初始化时总需要绑定一个执行参数,耦合性比较大,因此我们需要使用另一种更灵活的方式去使用Process创建进程。
3、创建Process子类
例:创建Process子类
以Process为基类,创建Process子类,将Process要调用的程序写在子类重写父类的run()方法中,创建Process子类对象后,调用子类对象的start()方法,调用start()方法后。会调用run()方法,因此就会执行Process子类中的run()方法。
Process类的主要方法有:
start():启动进程,并调用该子进程中的p.run()
run():进程启动进运行的方法,就是它去调用target指定的函数,我们自定义类的类中一定要实现该方法。
terminate():强制终止进程。不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用此方法需要小心:如果此进程还保存了一个锁那么也将不会释放这个锁,进而导致死锁。
is_alive():判断进程是否是“活着”的状态。
join([timeout]):让主线程等待某一子进程结束,才继续执行主进程。timeout是可选的超时时间。超过一个时间主进程就不等待了。