2016-12-17 54 views
-1

我有一本作者词典,每个作者是一本书的字典,每本书都是一个单词列表。嵌套字典和多处理

我需要一个多处理场景,其中每个进程都处理某个作者的某本书。

我尝试使用manager.dict()manager.list()来实例化字典和列表,但我的字典仍没有得到填充。

这是主要字典对象的声明方式。

import multiprocessing 
from multiprocessing import Manager 

manager = Manager() 
allWords = manager.dict() 

然后有一个功能read_author它执行任务distribtion

def read_author(author): 
     global allWords 
     allWords[author] = manager.dict() # each author is a dictionary of books 
     jobs = [] 
     for f in os.listdir(auth_dir): 
       p = multiprocessing.Process(target=read_doc, args=(author, auth_dir, f,)) 
       jobs.append(p) 
       p.start() 
     return jobs 

这是使我处理的功能。

def read_doc(author_name, author_dir, doc_name): 
     global allWords 
     allWords[author_name][doc_name] = manager.list() 
     # document is loaded in the variable doc and it has a set of words 
     for word in doc.words: 
      allWords[author_name][doc_name].append(word) 

文档从项目Gutenberg txt文件和上述doc目的是使用spacy构造的语法树。

read_doc实际上涉及到文件树的解析和提取以及bigrams的计数。为了简洁起见,我在代码示例中跳过了这些部分,但这是计数任务,我想分割多个CPU核心,这就是为什么我使用多处理。

+1

你的代码在哪里? –

+0

尝试编写一个显示您正在运行的问题的[MCVE] – pvg

+0

@PedroLobito我添加了一些代码。你能再看看吗? – Vahid

回答

1

Python多处理指南建议尽可能避免共享状态。
虽然它不是很清楚为什么你的代码不起作用, 我看不出有什么理由使用Manager和共享状态。
在此示例中的最后allWords字典中的主要工序组装在Pool过程中产生的单词列表:

def read_doc(author_name, doc_name): 
    # document is loaded in the variable doc and it has a set of words 
    return author_name, doc_name, list(doc.words) 

def read_doc_param_gen(authors): 
    for author in authors: 
     auth_dir = deduce_auth_dir(author) 
     for f in os.listdir(auth_dir): 
      yield author, f 

def read_authors(authors): 
    pool = multiprocessing.Pool() 
    allWords = collections.defaultdict(dict) 
    for author_name, doc_name, lst in pool.map(read_doc, read_doc_param_gen(authors)): 
     allWords[author_name][doc_name] = lst 
    return allWords 

还有Pool.imap如果您需要更新一些GUI或东西。