楼主:
ntuleo (里欧)
2015-04-29 09:41:58经过大家的提醒,我修改了我的代码如下
if __name__ == "__main__":
content = input_file(target).split("\n")
content = manager.list(content)
for files in source:
obj_grab.append((LogCatcher(files), content))
pool = Pool()
pool.map(transferConcat, obj_grab)
pool.close()
pool.join()
def concatMessage(logCatcher, content):
for key in logCatcher.dic_map:
regex = re.compile(key)
for j in range(len(content)):
for m in re.finditer(regex, content[j]):
content[j] += logCatcher.index + obj_grab.dic_map[key]
def transferConcat(args):
return concatMessage(*args)
结果变82秒....
人生已经如此的艰难...
请问这里哪一步又做错了呢?
作者: LiloHuang (十年一刻) 2015-04-29 20:01:00
你不应该尝试去修改输入的资料,除非是 Shared memory无论是 multiprocess 或者 multithread 的实作里你得想办法让每个 process (或 thread) 各自跑各自的等到跑完之后,再将资料做合并,才是一个比较好的方式当然这个方法未必适用于你要解决的问题,只是一旦使用Shared memory 之后,你就得进行 Synchronization 保护过度的 Synchronization 会造成 CPUs 浪费时间在竞争锁举个例子来说,假设输入是 a-z 的字串,平行的转成大写from multiprocessing.pool import ThreadPoolpool = ThreadPool()print reduce(lambda x,y: x+y, pool.map(lambda x:x.upper(), map(chr, range(97, 123))))上述的范例内,输入是一个 list (分别为 a-z 字符)输出也是一个 list (已经转成 A-Z),再用 reduce 合并这就是一个概念,想要平行处理就要让 task 真正的平行然而上述的例子,由于并不是 CPU intensive 的计算开了 thread (或 process) 反而会比没开来的慢我无法回答你的程式为何会如此慢,建议贴 GitHub Gist如果你能附上完整的程式码,以及可重现问题的输入资料相信其他板友会比较有机会能够帮你找到问题的症结点pool.map(...) 的概念是有输入跟输出,要特别留意这点另外实务上,请尽量避免使用 ThreadPool,改用 Pool我只是为求简便示范给你看,以免实际程式被 GIL 给拖慢