【发布时间】:2018-08-13 21:47:45
【问题描述】:
mpi4py 文档声称您可以通过 MPIPoolExecutor 传递 **kwargs,但我无法让它工作。我执行以下代码:
import time
import socket
import numpy as np
from mpi4py.futures import MPIPoolExecutor
from mpi4py import MPI
def print_val(x, kwargsstr):
time.sleep(1)
msg = "x value: " + str(x) + \
", socket: " + str(socket.gethostname()) + \
", rank: " + str(MPI.COMM_WORLD.Get_rank()) + \
", time: " + str(np.round(time.time(), 1)) + \
", kwargs string: " + kwargsstr
print(msg)
return x
def main():
kwarg = 'test'
kwargs = {'kwargsstr':kwarg}
with MPIPoolExecutor() as executor:
x_v = []
# for res in executor.map(print_val,
# range(9), 9*[kwarg]):
for res in executor.map(print_val,
range(9), **kwargs):
x_v += [res]
print(x_v)
if __name__ == '__main__':
"""
run on command line with 1 scheduler and 2 workers:
$ mpiexec -n 1 -usize 3 -machinefile hostfile.txt python mpi4py_kwargs.py
"""
main()
通过这个命令:
$ mpiexec -n 1 -usize 3 -machinefile hostfile.txt python mpi4py_kwargs.py
并收到此错误消息:
TypeError: print_val() missing 1 required positional argument: 'kwargsstr'
请注意,当 main 中的注释掉部分切换时,代码会按预期运行。
【问题讨论】:
-
kwargs = {'kwargstr':kwarg}是不是应该写成kwargs = {'kwargsstr':kwarg}的错字? -
你是对的,这是一个错字。我纠正了这个但得到了同样的错误。我将编辑问题。
-
看源码,觉得不支持kwargs。但是你无论如何都不会在
print_val中处理 kwargs。那么zip(range(9), [kwarg] * 9)作为第二个参数,executor.map没有**kwargs怎么样? -
啊,真令人失望。不幸的是,我实际应用程序中的函数还有很多参数。
executor.map(print_val, range(9), 9*[kwarg])在这个例子中完成了这项工作。
标签: python-3.x keyword-argument mpi4py