一个程序,它创建可在可连接队列上工作的多个进程Q,并最终可能操纵全局字典D来存储结果.(因此每个子进程可用于D存储其结果,并查看其他子进程正在生成的结果)
如果我在子进程中打印字典D,我会看到已对其进行的修改(即在D上).但是在主进程加入Q之后,如果我打印D,那就是空的dict!
我知道这是一个同步/锁定问题.有人能告诉我这里发生了什么,以及如何同步访问D?
我想通过Pool.map()将关键字参数传递给我的worker-function.在搜索论坛时,我找不到一个明确的例子.
示例代码:
import multiprocessing as mp
def worker((x,y), **kwargs):
kwarg_test = kwargs.get('kwarg_test', False)
print("kwarg_test = {}".format(kwarg_test))
if kwarg_test:
print("Success")
return x*y
def wrapper_process(**kwargs):
jobs = []
pool=mp.Pool(4)
for i, n in enumerate(range(4)):
jobs.append((n,i))
pool.map(worker, jobs) #works
pool.map(worker, jobs, kwargs) #how to do this?
def main(**kwargs):
worker((1,2),kwarg_test=True) #accepts kwargs
wrapper_process(kwarg_test=True)
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
输出:
kwarg_test = True
Success
kwarg_test = False
kwarg_test = False
kwarg_test = False
kwarg_test = False
TypeError: unsupported operand type(s) for //: 'int' and 'dict' …Run Code Online (Sandbox Code Playgroud) 这个问题可能是重复的。但是,我在这个话题上读了很多东西,但没有找到与我的情况相符的东西-至少,我不理解。
不便之处,敬请原谅。
我想做的是相当普遍的,将kwargs列表传递给pool.starmap(),以实现多处理。
这是我的简化案例:
def compute(firstArg, **kwargs): # A function that does things
# Fancy computing stuff...
# Saving to disk...
return True
if __name__ == '__main__':
args = [{
'firstArg': "some data",
'otherArg': "some other data"
'andAnotherArg': x*2
} for x in range(42)]
pool = Pool(4)
pool.starmap(compute, args)
pool.close()
pool.terminate()
Run Code Online (Sandbox Code Playgroud)
我以为starmap()将解压缩字典并将其作为关键字args传递给compute(),但是查看源代码(另请参见l.46),它仅发送键(或值?)。
因此它提出了:
TypeError: compute() takes 1 positional argument but 3 were given
Run Code Online (Sandbox Code Playgroud)
它必须是一种清晰,直接的方法来进行此操作。任何帮助将不胜感激。
这是一个非常类似的问题:Python多重处理-如何将kwargs传递给函数?