151
社区成员
发帖
与我相关
我的任务
分享上一篇我们学完了多线程,知道 Python 因为GIL 全局解释器锁,多线程没法利用多核 CPU 做密集计算。想要真正并行跑程序、利用多核性能,就要用多进程。
import multiprocessing
import time
用法和多线程很像,直接套用就行:
import multiprocessing
import time
def work(name):
print(f"子进程 {name} 开始运行")
time.sleep(2)
print(f"子进程 {name} 运行结束")
if __name__ == "__main__":
p1 = multiprocessing.Process(target=work, args=("进程1",))
p2 = multiprocessing.Process(target=work, args=("进程2",))
p1.start()
p2.start()
p1.join()
p2.join()
print("所有进程执行完毕")
注意:Windows 系统必须写
if __name__ == "__main__":
进程不共享全局变量,各自有独立内存:
import multiprocessing
num = 100
def change():
global num
num = 999
print("子进程num:", num)
if __name__ == "__main__":
p = multiprocessing.Process(target=change)
p.start()
p.join()
print("主进程num:", num)
运行结果:主进程还是 100,子进程改不动主进程数据。
继承 multiprocessing.Process,重写 run 方法:
import multiprocessing
import time
class MyProcess(multiprocessing.Process):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print(f"自定义进程 {self.name} 启动")
time.sleep(1.5)
print(f"自定义进程 {self.name} 结束")
if __name__ == "__main__":
p1 = MyProcess("A")
p2 = MyProcess("B")
p1.start()
p2.start()
任务数量多的时候,不用手动创建一堆进程,用进程池自动管理:
import multiprocessing
import time
def task(num):
print(f"任务 {num} 执行中")
time.sleep(1)
return num * num
if __name__ == "__main__":
# 创建容量为3的进程池
pool = multiprocessing.Pool(3)
# 批量提交任务
result = pool.map(task, range(1,7))
print("任务结果:", result)
pool.close()
pool.join()
进程默认隔离,想用队列互相传数据:
import multiprocessing
def put_data(q):
# 子进程放数据
q.put("Hello 多进程")
def get_data(q):
# 子进程取数据
print("收到消息:", q.get())
if __name__ == "__main__":
# 创建队列
q = multiprocessing.Queue()
p1 = multiprocessing.Process(target=put_data, args=(q,))
p2 = multiprocessing.Process(target=get_data, args=(q,))
p1.start()
p2.start()
p1.join()
p2.join()
本篇系统学习了 Python 多进程核心知识点:进程与线程区别、进程创建两种方式、进程数据隔离、进程池、队列通信 Queue。
多进程最大优势是绕过 GIL 锁,利用多核 CPU,适合大数据计算、视频处理、批量压缩、复杂运算等场景。