并行运行方法

时间:2014-04-02 11:26:36

标签: python multiprocessing

我有一个程序,除其他外,解析一些大文件,我想并行完成这个以节省时间。 代码流看起来像这样:

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)

第二次。这真的不是我想要的。它甚至发生在我只运行其中一个进程时。

我怎样才能让只是文件解析方法彼此并行运行,然后像以前那样继续使用主进程?

2 个答案:

答案 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类似于线程模块。多处理包   提供本地和远程并发,有效地侧面步进   全局解释器锁通过使用子进程而不是线程。   因此,多处理模块允许程序员完全   利用给定机器上的多个处理器。