如何向父级字典写入内容?

3

我该如何写入父级字典?我给一些子级一个url列表来获取数据,然后需要将这些数据写入到父级字典中:

from multiprocessing import Pool
import random

parent_dict={}
urls = ['www.yahoo.com','www.google.com','www.microsoft.com','www.apple.com','www.cisco.com']

def workit(url):
    # retrieve the urls, process some stuff and then add that info to parent_dict
    key = random.randrange(1,10) # pretend that this is the variable that we want in parent_dict
    value = random.randrange(11,20)
    parent_dict[key] = value

pool = Pool(processes = 5)
pool.map(workit,urls)


print parent_dict # returns {}}

你不能在这里操纵父字典。如果你仔细阅读了多进程文档,就会知道代码是在专门的“进程”中执行的。这就是为什么它被称为“多进程”而不是“多线程”。 - user2665694
@Maulwurfn: 阅读此链接:http://docs.python.org/library/multiprocessing.html#exchanging-objects-between-processes - Blender
@Maulwurth: 我有点困惑。Blender和Maulwurfn给出的所有链接似乎都在暗示多进程是答案,而不是多线程...作为一个新手,希望你不要把我在问题中提供的代码当作“真理”。我确实不知道正确的方法。我只是想弄清楚如何从子类访问父变量。 - user776942
可能是重复的问题Python多进程中的子父通信 - Martijn Pieters
1个回答

2
以下代码基本上是你的,经过修改以处理在Python多进程文档中提到的传递manager.dict
from multiprocessing import Pool
from multiprocessing import Manager
import random

manager = Manager()
dproxy = manager.dict()

urls = ['www.yahoo.com','www.google.com','www.microsoft.com','www.apple.com','www.cisco.com']



def f(url):
    shared_dict = dproxy[0]
    key = random.randrange(1,10)
    value = random.randrange(11,20)
    shared_dict[key] = value
    dproxy[0] = shared_dict

if __name__ == '__main__':
    dproxy[0] = {}
    pool = Pool(processes=5)

    pool.map(f, urls)
    print dproxy[0]

这里有几件需要注意的事情是关键问题:

  1. 这并不总是创建具有相同长度的字典。如果您现在正在思考(某些键被覆盖),我将字典更改为列表,并将shared_dict[key] = value更改为shared_list.append((key,value))。确实发生了覆盖,但程序实际上也写入了可变数量的键值对。有时是三个,有时是两个,有时是四个。我已经在此处添加了代码以供您参考,但我永远不会使用我发布的代码做任何事情
  2. 当从idle运行时,它的表现不佳。您需要使用python .py从命令行运行它。
  3. 我是否提到过,除了测试以外,您不应该使用此代码来说“嗯,那确实效果很差,不是吗?”如果您可以解决问题,那就更好了,但我想象中肯定有一种更好的方法来设置它,可以完全避开这个问题。

祝你好运。不要使用我的代码。它可以运行而且不会给你带来恶意软件,但这就是它的全部优点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接