我正在阅读大量文件并解析它们,所以我想并行化这个过程。我通过以下方式成功实现了这一目标:
def parse_xml(files):
for filename in files:
with open(os.path.expanduser(filename), 'rb') as data_file:
# parse logic
return dict # key is each file name
def main():
numthreads = 16
numfiles = 24
pool = multiprocessing.Pool(processes=numthreads)
rootDir = '~/someLocation/' # directory that has all the files
paths = [rootDir + f for f in os.listdir(os.path.expanduser(rootDir)) if len(f) > 1]
try:
file_list = pool.map(parse_xml, (paths[fname:fname+numfiles] for fname in xrange(0,len(paths), numfiles)))
process_results(file_list)
pool.close()
pool.join()
except KeyboardInterrupt:
pool.terminate()
一切正常但现在我想在我的parse_xml
方法中解析一个用于过滤目的的集合。
阅读pool.map文档后,我意识到它不可能。所以我写了下面的附加包装方法:
def parse_xml_wrapper(multiples):
return parse_xml(*multiples)
在我的main而不是调用parse_xml我在解析它的设置时调用这个包装器方法:
file_list = pool.map(parse_xml_wrapper(mySet), (paths[fname:fname+numfiles] for fname in xrange(0,len(paths), numfiles)))
我修改了parse_xml
方法以接受集合def parse_xml(files, mySet)
TypeError: parse_xml() takes exactly 2 arguments (110277 given)
如何成功解析在Pool
中调用的方法中的另一个参数