个性化阅读
专注于IT技术分析

在Python多处理中共享可变全局变量

我正在尝试使用以下代码更新共享库(字典)。但这行不通。它给了我输入字典作为输出。

编辑:过度地, 我要在这里实现的是将数据(列表)中的项追加到字典的列表中。数据项给出字典中的索引。

预期输出:{‘2’:[2], ‘1’:[1、4、6], ‘3’:[3、5]}

注意:方法2引发错误TypeError:’int’对象不可迭代

方法1

from multiprocessing import *
def mapTo(d, tree):
        for idx, item in enumerate(list(d), start=1):
            tree[str(item)].append(idx)

data=[1, 2, 3, 1, 3, 1]
manager = Manager()
sharedtree= manager.dict({"1":[], "2":[], "3":[]})
with Pool(processes=3) as pool:
    pool.starmap(mapTo, [(data, sharedtree ) for _ in range(3)])

方法2

 from multiprocessing import *
 def mapTo(d):
         global tree
         for idx, item in enumerate(list(d), start=1):
             tree[str(item)].append(idx)

 def initializer():
      global tree
      tree = dict({"1":[], "2":[], "3":[]})
 data=[1, 2, 3, 1, 3, 1]
 with Pool(processes=3, initializer=initializer, initargs=()) as pool:
     pool.map(mapTo, data)```

#1


如果要反映更改, 则需要使用托管列表。因此, 以下对我有用:

from multiprocessing import *
def mapTo(d, tree):
        for idx, item in enumerate(list(d), start=1):
            tree[str(item)].append(idx)

if __name__ == '__main__':
    data=[1, 2, 3, 1, 3, 1]

    with Pool(processes=3) as pool:
        manager = Manager()
        sharedtree= manager.dict({"1":manager.list(), "2":manager.list(), "3":manager.list()})
        pool.starmap(mapTo, [(data, sharedtree ) for _ in range(3)])

    print({k:list(v) for k, v in sharedtree.items()})

这是输出:

{'1': [1, 1, 1, 4, 4, 4, 6, 6, 6], '2': [2, 2, 2], '3': [3, 3, 5, 3, 5, 5]}

请注意, 使用多重处理时应始终使用if __name__ ==’__main__’:警惕, 同时也要避免加星号。

编辑

如果你使用的是Python <3.6, 则必须重新分配, 因此可将其用于mapTo:

def mapTo(d, tree):
        for idx, item in enumerate(list(d), start=1):
            l = tree[str(item)]
            l.append(idx)
            tree[str(item)] = l

最后, 你没有正确使用starmap / map, 你正在传递数据三次, 因此, 当然, 所有内容都会被计数三次。映射操作应在要映射的数据的每个单独元素上进行, 因此你需要执行以下操作:

from functools import partial
from multiprocessing import *
def mapTo(i_d, tree):
    idx, item = i_d
    l = tree[str(item)]
    l.append(idx)
    tree[str(item)] = l

if __name__ == '__main__':
    data=[1, 2, 3, 1, 3, 1]

    with Pool(processes=3) as pool:
        manager = Manager()
        sharedtree= manager.dict({"1":manager.list(), "2":manager.list(), "3":manager.list()})
        pool.map(partial(mapTo, tree=sharedtree), list(enumerate(data, start=1)))

    print({k:list(v) for k, v in sharedtree.items()})
赞(0)
未经允许不得转载:srcmini » 在Python多处理中共享可变全局变量

评论 抢沙发

评论前必须登录!