Python 多进程创建的四种方式详解
本文详细解析 Python 中创建子进程的四种主要方式。首先介绍仅适用于 Unix/Linux 的 os.fork() 方法;其次讲解使用 multiprocessing.Process 类直接创建进程及 join() 同步机制;接着演示通过继承 Process 类自定义进程的行为;最后深入探讨使用进程池 Pool 管理大量并发任务的最佳实践,涵盖阻塞与非阻塞调用模式。
在子进程被创建时,系统会将父进程的数据空间完整复制一份给子进程,确保两者之间的数据相互独立,互不干扰。
使用 os.fork() 创建进程
使用 os.fork() 函数创建进程
需要注意的是,os.fork() 方法仅能在 Unix 或 Linux 操作系统中运行,Windows 系统不支持此功能。
import os
# 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以
pid = os.fork()
# 子进程永远返回0,而父进程返回子进程的ID。
if pid == 0:
print('子进程')
else:
print('父进程')
使用 Process 类创建进程
使用 Process 类创建进程
multiprocessing 模块提供了 Process 类,用于代表一个进程对象。以下示例展示了如何启动一个子进程并等待其执行完毕:
from multiprocessing import Process
import time
def test(name, age):
for i in range(5):
print("--test--%s\t%d" % (name, age))
time.sleep(1)
print("子进程结束")
if __name__ == '__main__':
p = Process(target=test, args=("aaa", 18))
p.start()
# 等待进程实例执⾏结束,或等待多少秒;
p.join() # 等待的最长时间
print("主进程结束")
"""
输出结果:
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
子进程结束
主进程结束
"""
join() 方法的作用是使主进程阻塞,直到子进程执行完成后再继续向下执行。如果注释掉 join() 语句,主进程在启动子进程后将立即继续执行后续代码,而不会等待子进程结束,最终导致主进程先于子进程退出。
注释掉 join() 方法后的运行结果如下:
"""
输出结果:
主进程结束
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
子进程结束
"""
通过继承 Process 子类创建进程
通过继承 Process 子类创建进程
除了直接使用 Process 类,还可以通过定义自定义类并继承 Process 类来创建新进程。每次实例化该子类时,即等同于实例化一个进程对象。具体实现见下方示例:
from multiprocessing import Process
import time
import os
class MyProcess(Process):
def __init__(self):
# 如果子类要重写__init__是必须要先调用父类的__init__否则会报错
# Process.__init__(self)
super(MyProcess,self).__init__()
# 重写Porcess的run()方法
def run(self):
print("子进程(%s)开始执行,父进程(%s)" % (os.getpid(), os.getppid()))
for i in range(5):
print("--1--")
time.sleep(1)
if __name__ == '__main__':
t_start = time.time()
p = MyProcess()
p.start()
# p.join()
print("main")
for i in range(5):
print("--main--")
time.sleep(1)
使用进程池 Pool 创建进程
使用进程池 Pool 创建进程
当需要创建的子进程数量较少时,可以直接利用 multiprocessing 模块中的 Process 动态生成多个进程。然而,如果需要创建上百甚至上千个子进程,手动创建的工作量将极其巨大。此时,可以使用 multiprocessing 模块提供的 Pool(进程池)方法来高效管理。
在初始化 Pool 时,可以指定最大进程数。当有新请求提交到进程池时,如果池未满,则创建新进程执行该请求;如果池已满(达到指定的最大进程数),请求将被挂起等待,直到池中某个进程结束,系统才会创建新进程来执行该请求。具体示例如下:
from multiprocessing import Pool
import os
import time
def worker(num):
# for i in range(3):
print("----pid=%d num=%d---" % (os.getpid(), num))
time.sleep(1)
if __name__ == '__main__':
# 定义一个进程池,最大进程数3
pool = Pool(3)
for i in range(10):
print("---%d--" % i)
# 使用非阻塞方式调用func(并行执行),一般用这个。
# apply堵塞方式必须等待上一个进程退出才能执行下一个进程,用的不多。
pool.apply_async(worker, (i,))
# 关闭进程池
pool.close()
# 等待所有子进程结束,主进程一般用来等待
pool.join() # 进程池后面无操作时必须有这句
以上内容涵盖了 Python 中多进程创建的主要方式,希望能为读者提供有益的帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









