当然可以。以下是带有详细注释的代码示例,解释了每一行代码的作用:
### 子程序模块 (`submodule.py`)
```python
# submodule.pydef square(number):
"""计算一个数的平方"""
return number ** 2
```
- `def square(number):`:定义一个名为 `square` 的函数,该函数接受一个参数 `number`。
- `return number ** 2`:返回参数 `number` 的平方值。
### 主程序 (`main.py`)
```python
# main.pyimport multiprocessing # 导入 multiprocessing 模块,用于创建和管理进程
from submodule import square # 从 submodule 模块中导入 square 函数def worker(number, result_queue):
"""工作进程的函数"""
result = square(number) # 调用 square 函数计算 number 的平方
result_queue.put(result) # 将计算结果放入结果队列中if __name__ == '__main__':
# 待处理的数据列表
numbers = [1, 2, 3, 4, 5] # 定义一个列表,包含需要计算平方的数字
# 创建一个队列用于存储结果
result_queue = multiprocessing.Queue() # 创建一个进程安全的队列
# 创建进程列表
processes = [] # 初始化一个空列表,用于存储进程对象
# 创建并启动进程
for number in numbers:
p = multiprocessing.Process(target=worker, args=(number, result_queue)) # 创建一个进程对象
p.start() # 启动进程
processes.append(p) # 将进程对象添加到列表中
# 等待所有进程完成
for p in processes:
p.join() # 等待每个进程完成执行
# 获取结果
results = [] # 初始化一个空列表,用于存储计算结果
while not result_queue.empty():
results.append(result_queue.get()) # 从队列中取出结果并添加到列表中
# 输出结果
print("Results:", results) # 打印最终的计算结果
```
### 代码解释
- **导入模块**:
- `import multiprocessing`:导入 `multiprocessing` 模块,用于创建和管理多进程。
- `from submodule import square`:从 `submodule.py` 文件中导入 `square` 函数,以便在主程序中使用.
- **定义工作函数**:
- `def worker(number, result_queue):`:定义一个名为 `worker` 的函数,该函数接受两个参数:`number`(需要计算平方的数字)和 `result_queue`(用于存储结果的队列).
- `result = square(number)`:调用 `square` 函数计算 `number` 的平方,并将结果赋值给变量 `result`.
- `result_queue.put(result)`:将计算得到的 `result` 放入 `result_queue` 中,以便后续获取结果.
- **主程序入口**:
- `if __name__ == '__main__':`:确保代码在主进程中执行,防止在子进程中意外执行.
- `numbers = [1, 2, 3, 4, 5]`:定义一个包含待处理数字的列表.
- `result_queue = multiprocessing.Queue()`:创建一个进程安全的队列,用于存储各个进程的计算结果.
- `processes = []`:初始化一个空列表,用于存储创建的进程对象.
- **创建并启动进程**:
- `for number in numbers:`:遍历 `numbers` 列表中的每个数字.
- `p = multiprocessing.Process(target=worker, args=(number, result_queue))`:创建一个进程对象,指定 `worker` 函数为执行目标,并传递相应的参数(`number` 和 `result_queue`).
- `p.start()`:启动进程,使其开始执行 `worker` 函数.
- `processes.append(p)`:将创建的进程对象添加到 `processes` 列表中,以便后续管理.
- **等待进程完成**:
- `for p in processes:`:遍历 `processes` 列表中的每个进程对象.
- `p.join()`:调用 `join()` 方法等待每个进程完成执行,确保主程序在所有子进程结束后再继续执行.
- **获取并输出结果**:
- `results = []`:初始化一个空列表,用于存储从队列中获取的计算结果.
- `while not result_queue.empty():`:当队列不为空时,循环从队列中获取结果.
- `results.append(result_queue.get())`:从队列中取出一个结果,并将其添加到 `results` 列表中.
- `print("Results:", results)`:打印最终的计算结果列表,展示每个数字的平方值.
通过这些注释,你可以更好地理解代码的结构和每一行代码的作用,从而更好地掌握多进程编程的技巧.