我有一个程序,除其他外,解析一些大文件,我想并行完成这个以节省时间。 代码流看起来像这样:
if __name__ == '__main__':
obj = program_object()
obj.do_so_some_stuff(argv)
obj.field1 = parse_file_one(f1)
obj.field2 = parse_file_two(f2)
obj.do_some_more_stuff()
我尝试在不同的进程中运行文件解析方法,如下所示:
p_1 = multiprocessing.Process(target=parse_file_one, args=(f1))
p_2 = multiprocessing.Process(target=parse_file_two, args=(f2))
p_1.start()
p_2.start()
p_1.join()
p_2.join()
这里有两个问题。一个是如何让单独的过程修改字段,但更重要的是,分支过程重复我的整个主要!执行
时,我对argv有异常do_so_some_stuff(argv)
第二次。这真的不是我想要的。它甚至发生在我只运行其中一个进程时。
我怎样才能让只是文件解析方法彼此并行运行,然后像以前那样继续使用主进程?
答案 0 :(得分:1)
尝试将解析方法放在一个单独的模块中。
答案 1 :(得分:1)
首先,我想而不是:
obj = program_object()
program_object.do_so_some_stuff(argv)
你的意思是:
obj = program_object()
obj.do_so_some_stuff(argv)
其次,尝试使用这样的线程:
#!/usr/bin/python
import thread
if __name__ == '__main__':
try:
thread.start_new_thread( parse_file_one, (f1) )
thread.start_new_thread( parse_file_two, (f2) )
except:
print "Error: unable to start thread"
但是,正如Wooble所指出的,根据解析函数的实现,由于GIL,这可能不是真正并行执行的解决方案。
在这种情况下,您应该检查将执行真正并发执行的Python multiprocessing
模块:
multiprocessing
是一个使用a支持产生进程的包 API类似于线程模块。多处理包 提供本地和远程并发,有效地侧面步进 全局解释器锁通过使用子进程而不是线程。 因此,多处理模块允许程序员完全 利用给定机器上的多个处理器。