Python 中创建进程的3种方式
1.使用multiprocessing模块创建进程:
```python
from multiprocessing import Process # 导入模块
import time
import os
# 使用multiprocessing模块创建进程
def child_1(interval): # 子程序1调用的方法
print("子进程(%s)开始执行,父进程为(%s)" % (os.getpid(), os.getppid()))
time_s = time.time() # 开始计时
time.sleep(interval) # 程序将会被挂起interval秒
time_e = time.time() # 计时结束
print("子进程(%s)执行时间为'%0.2f'秒" % (os.getpid(), time_e-time_s))
def child_2(interval): # 子进程2调用的方法
print("子进程(%s)开始执行,父进程为(%s)" % (os.getpid(), os.getppid()))
time_s = time.time()
time.sleep(interval)
time_e = time.time()
print("子进程(%s)执行时间为'%0.2f'秒" % (os.getpid(), time_e - time_s))
def main(): # 执行主程序
print("-"*10+"父进程开始执行"+"-"*10)
print("父进程PID:%s" % os.getpid()) # 打印当前程序的ID
p1 = Process(target=child_1, args=(1,)) # 实例化进程p1
p2 = Process(target=child_2, name="mrsoft", args=(2,)) # 实例化进程p2
p1.start() # 启动进程p1
p2.start() # 启动进程P2
# 同时父进程仍然往下执行,判断p1,p2是否还在执行,是返还True
print("p1.is_alive=%s" % p1.is_alive())
print("p2.is_alive=%s" % p2.is_alive())
# 打印p1和p2进程的别名和PID
print("p1.name=%s" % p1.name)
print("p1.pid=%s" % p1.pid)
print("p2.name=%s" % p2.name)
print("p2.pid=%s" % p2.pid)
print("-"*10+"等待子进程"+"-"*10)
p1.join() # 等待p1进程结束
p2.join() # 等待p2进程结束
print("-"*10+"父进程结束"+"-"*10)
if __name__ == '__main__':
main() # 调用main()函数
2.使用Process子类创建进程
```python
from multiprocessing import Process # 导入模块
import time
import os
# 继承Process类
class SubProcess(Process):
'''代码中定义了一个SubProcess子类,继承multiprocessing.Process父类。SubProcess子类中定义了两个方法:
__init__()初始化方法和run()方法。在__init__()初始化方法中,调用multiprocessing.Process父类的__init__()
初始化方法,否则父类初始化方法会被覆盖,无法启动进程。此外,在SubProcess子类中并没有定义start()方法,
但在主程序中调用了start()方法,此时会自动执行SubProcess类的run方法
'''
# 由于Process类本身也有__init__()初始化方法,这个子类相当于重写了父类的这个方法
def __init__(self, interval, name=""):
Process.__init__(self) # 调用Process父类的初始化方法
self.interval = interval # 接收参数interval
if name: # 判断传递到额参数name是否存在
self.name = name # 如果传递参数name,则为子进程创建name属性,否则使用默认属性
# 重写Process类的run()方法
def run(self):
print("子进程(%s)开始执行,父进程为(%s)" % (os.getpid(), os.getppid()))
time_s = time.time()
time.sleep(self.interval)
time_e = time.time()
print("子进程(%s)执行时间为'%0.2f'秒" % (os.getpid(), time_e-time_s))
if __name__ == '__main__':
print("-"*10+"父进程开始执行"+"-"*10)
print("父进程PID:%s" % os.getpid()) # 打印当前程序的ID
p1 = SubProcess(interval=1)
p2 = SubProcess(interval=2, name="mrsoft")
# 对一个不包含target属性的Process类执行start()方法,就会运行这个类中的run()方法
# 所以这里会执行p1.run()和p2.run()
p1.start()
p2.start()
print("p1.is_alive=%s" % p1.is_alive())
print("p2.is_alive=%s" % p2.is_alive())
print("p1.name=%s" % p1.name)
print("p1.pid=%s" % p1.pid)
print("p2.name=%s" % p2.name)
print("p2.pid=%s" % p2.pid)
print("-"*10+"等待子进程"+"-"*10)
p1.join()
p2.join()
print("-"*10+"父进程结束"+"-"*10)
3.使用进程池Pool类创建进程:
from multiprocessing import Pool # 导入模块
import time
import os
def task(name):
print("子进程(%s)开始执行task %s..." % (os.getpid(), name))
time.sleep(1) # 休眠1 秒
if __name__ == '__main__':
print("父进程(%s)" % os.getpid())
p = Pool(3) # 创建一个进程池,最大进程数为3
for i in range(10): # 从0开始循环10次
p.apply_async(task, args=(i,)) # 使用非阻塞的方式调用task()函数
print("等待所有子进程结束...")
p.close() # 关闭进程池,关闭后不再接受新的请求
p.join() # 等待子进程结束
print("所有子进程结束.")