2

親の辞書に書き込むにはどうすればよいですか? 取得する一部の子に 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 {}}
4

1 に答える 1

1

manager.dict次のコードは多かれ少なかれあなたのものであり、python multiprocessing docs で言及されているの受け渡しに対処するように調整されています。

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((キー、値))に変更しました。上書きが行われています、プログラムは実際には可変数のペアも書き込んでいます。3つのときもあれば、2つのときもあれば、4つのときもあります。私はあなたの教育のためにここにコードを追加しましたが、私が投稿したコードを実際に使用して何かをすることはありません.
  2. から実行すると、これはうまく動作しませんidle。代わりに python .py を使用して、コマンド ラインから実行することをお勧めします。
  3. テスト以外でこのコードを使用して、「これはうまく機能しませんでしたね」と言ってはいけません。問題を回避する方法を見つけることができれば、より多くの力を得ることができますが、問題を完全に回避するように設定するより良い方法があると想像する必要があります.

あなたが決めたことは何でも頑張ってください。私のコードを使用しないでください。実行され、マルウェアを提供することはありませんが、それだけで有利になります。

于 2012-08-22T05:25:18.480 に答える