本文目录导读:

我来详细介绍Python多进程创建进程的几种主要方式:
使用Process类(最基础)
from multiprocessing import Process
import os
def worker(name):
print(f'子进程 {name} 运行中,PID: {os.getpid()}')
if __name__ == '__main__':
print(f'主进程 PID: {os.getpid()}')
# 创建多个子进程
processes = []
for i in range(3):
p = Process(target=worker, args=(f'进程-{i}',))
processes.append(p)
p.start()
# 等待所有子进程结束
for p in processes:
p.join()
print('所有进程执行完毕')
继承Process类(面向对象方式)
from multiprocessing import Process
import os
import time
class MyProcess(Process):
def __init__(self, name, delay):
super().__init__()
self.name = name
self.delay = delay
def run(self): # 重写run方法
print(f'{self.name} 开始执行,PID: {os.getpid()}')
time.sleep(self.delay)
print(f'{self.name} 执行完成')
if __name__ == '__main__':
# 创建进程实例
p1 = MyProcess('进程A', 2)
p2 = MyProcess('进程B', 3)
# 启动进程
p1.start()
p2.start()
# 等待完成
p1.join()
p2.join()
print('所有进程执行完毕')
使用Pool进程池(批量管理)
from multiprocessing import Pool
import os
import time
def square(n):
time.sleep(1) # 模拟耗时操作
result = n * n
print(f'进程 {os.getpid()} 计算: {n}^2 = {result}')
return result
if __name__ == '__main__':
# 创建进程池,默认使用CPU核心数
with Pool(processes=4) as pool:
# 方法1: 同步执行
# results = pool.map(square, range(10))
# 方法2: 异步执行
results = pool.map_async(square, range(10))
results.wait() # 等待所有完成
print(f'最终结果: {results.get()}')
print('进程池使用完毕')
进程间通信示例
from multiprocessing import Process, Queue
import os
import time
def producer(queue):
"""生产者进程"""
for i in range(5):
data = f'数据-{i}'
print(f'生产者 {os.getpid()} 发送: {data}')
queue.put(data)
time.sleep(0.5)
def consumer(queue):
"""消费者进程"""
while True:
data = queue.get()
if data == 'END': # 结束信号
break
print(f'消费者 {os.getpid()} 接收: {data}')
time.sleep(1)
if __name__ == '__main__':
# 创建队列用于进程间通信
queue = Queue()
# 创建生产者和消费者进程
p1 = Process(target=producer, args=(queue,))
p2 = Process(target=consumer, args=(queue,))
# 启动进程
p1.start()
p2.start()
# 等待生产者完成
p1.join()
# 发送结束信号
queue.put('END')
# 等待消费者完成
p2.join()
print('通信完成')
实际应用:多进程下载器
from multiprocessing import Process, Queue
import requests
import time
import os
def download_file(url, save_path):
"""下载文件"""
try:
print(f'进程 {os.getpid()} 开始下载: {url}')
response = requests.get(url, stream=True)
with open(save_path, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
print(f'下载完成: {url}')
return True
except Exception as e:
print(f'下载失败 {url}: {e}')
return False
def worker(task_queue):
"""工作进程"""
while not task_queue.empty():
try:
url, save_path = task_queue.get_nowait()
download_file(url, save_path)
except:
break
if __name__ == '__main__':
# 下载任务列表
downloads = [
('https://example.com/file1.zip', 'downloads/file1.zip'),
('https://example.com/file2.zip', 'downloads/file2.zip'),
('https://example.com/file3.zip', 'downloads/file3.zip'),
('https://example.com/file4.zip', 'downloads/file4.zip'),
]
# 创建任务队列
task_queue = Queue()
for url, path in downloads:
task_queue.put((url, path))
# 创建进程池
processes = []
num_processes = min(3, len(downloads)) # 最多3个进程
for _ in range(num_processes):
p = Process(target=worker, args=(task_queue,))
processes.append(p)
p.start()
# 等待所有进程完成
for p in processes:
p.join()
print('所有下载任务完成')
重要注意事项
if __name__ == '__main__':- Windows系统必须使用这个保护- 进程间不共享全局变量 - 需要使用
Queue、Pipe等通信 - 资源消耗 - 每个进程有自己的内存空间,比线程开销大
- 调试困难 - 进程间独立,错误传递比较复杂
- 避免死锁 - 使用
join()时注意顺序
| 方法 | 说明 | 适用场景 |
|---|---|---|
start() |
启动进程 | 所有进程 |
join(timeout) |
等待进程结束 | 需要同步 |
terminate() |
强制终止 | 超时或异常 |
is_alive() |
检查进程是否运行 | 状态监控 |
daemon |
设置为守护进程 | 后台任务 |
选择哪种方式取决于你的具体需求:简单任务用Process类,批量任务用Pool,复杂逻辑可以继承Process类。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播