当进行多处理时,每个子进程都会获得主模块中在if __name__ == '__main__':语句之前定义的所有全局变量的副本。{{cdm>中访问的每个进程都将是不同的。在
一种解决方法是使用共享列表,而共享列表又需要一个SyncManager来同步进程之间对共享资源的访问(这是通过调用multiprocessing.Manager()创建的)。然后使用它创建一个列表,在下面的代码中存储结果(我将其命名为matches,而不是match)。在
我还必须使用functools.partial()创建一个可以从修改后的link_match函数中调用的单个参数,该函数现在接受两个参数,而不是一个(这是pool.map()期望的那种)。在from functools import partial
import glob
import multiprocessing
def link_match(matches, file): # note: added results list argument
links = json.load(file)
for link in links:
try:
for other_link in other_links:
if link['data'] == other_link['data']:
matches.append(link)
else:
pass
else:
print "not found"
if __name__ == '__main__':
manager = multiprocessing.Manager() # create SyncManager
matches = manager.list() # create a shared list here
link_matches = partial(link_match, matches) # create one arg callable to
# pass to pool.map()
pool = multiprocessing.Pool(processes=6)
list_files = glob.glob("/path/*.json") # only used here
pool.map(link_matches, list_files) # apply partial to files list
pool.close()
pool.join()
print(matches)