python - 使用池和地图的多处理问题
问题描述
我想通过在 python 中使用 pool 和 map 函数来获取输出,如下所示:
**以随机顺序输出:
PoolWorker-10 输出:[0, 4, 8, 12, 16, 20]
PoolWorker-11 输出:[0, 4, 8, 12, 16, 20]
PoolWorker-12 输出:[0, 4, 8, 12, 16, 20]
PoolWorker-1 输出:[0, 4, 8, 12, 16, 20]
.....**
我尝试了几次将输出结果和 current_process 名称一起写入,但我失败了。我不知道应该更改哪个以获得像上面那样的打印输出。
from multiprocessing import Pool, current_process
def multiprocessing_func():
input_list = [0, 1, 2, 3, 4, 5]
print("input list: {}".format(input_list))
print("Output in random order: ")
pool = Pool(10, current_process_func)
result = pool.map(calculate, input_list)
print(result)
pool.close()
pool.join()
def calculate(y_list):
return y_list * 4
def current_process_func():
print("{} output: ".format(current_process().name))
if __name__ == '__main__':
multiprocessing_func()
当我运行它时,我得到如下结果:
以随机顺序输出:
PoolWorker-1 输出:
PoolWorker-2 输出:
PoolWorker-3 输出:
PoolWorker-4 输出:
PoolWorker-5 输出:
PoolWorker-7 输出:
PoolWorker-6 输出:
[0、4、8、12、16、20]
PoolWorker-8 输出:
PoolWorker-9 输出:
PoolWorker-10 输出:
我应该改变什么以获得我想要的结果?
解决方案
更改了您的代码段,如下所示。总体考虑以下几点:
pool.map(func, data)
data 应该理解为要在 cpu-pool 中分布的数据(也是这个进程独有的)。此外,至少应该有与进程一样多的项目,以充分利用池。(我只是在那里放了 10 个相同的列表)。跳过
Pool()
构造中的初始化参数,以便在计算完成后仅输出所需的数据。from multiprocessing import Pool, current_process def multiprocessing_func(): input_list = [0, 1, 2, 3, 4, 5] print("input list: {}".format(input_list)) print("Output in random order: ") pool = Pool(10) result = pool.map(calculate, [input_list]*10) print() print("collected:" , result) pool.close() pool.join() def calculate(y_list): out = [x*4 for x in y_list] current_process_func(out) return out def current_process_func(data): print("{} output: {}".format(current_process().name, data)) if __name__ == '__main__': multiprocessing_func()
导致:
input list: [0, 1, 2, 3, 4, 5]
Output in random order:
ForkPoolWorker-52 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-55 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-57 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-51 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-53 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-54 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-56 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-58 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-60 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-59 output: [0, 4, 8, 12, 16, 20]
collected: [[0, 4, 8, 12, 16, 20], [0, 4, 8, 12, 16, 20], [0, 4, 8, 12, 16, 20], [0, 4, 8, 12, 16, 20], [0, 4, 8, 12, 16, 20], [0, 4, 8, 12, 16, 20], [0, 4, 8, 12, 16, 20], [0, 4, 8, 12, 16, 20], [0, 4, 8, 12, 16, 20], [0, 4, 8, 12, 16, 20]]
这是你所期望的吗?
推荐阅读
- .htaccess - 为什么在 wordpress htaccess http 到 https 重定向仅适用于主页?
- ios - 如何在 iOS Swift 中将数据数组回调到另一个 viewController
- git - 在 Github 上找不到存储库的设置
- python - Keras 导入模型 AttributeError:“NoneType”对象没有属性“op”
- css - 如何在 WebStorm 中美化 CSS?
- python - 在Django中的线程内按记录提交保存操作记录
- travis-ci - 为什么不工作Jacoco?我希望我做的一切都是正确的
- node.js - 使用 Nginx 和 Socketio 的 Docker 上的 SSL 握手问题
- php - 如何在mysql中创建排行榜排名?
- json - 如何在 Spring Boot 中添加从相关对象的哈希集中序列化的 JSON 数组字段