我有一个简单的Python脚本,它使用两个更复杂的Python脚本,并对结果做一些事情。
我有两个模块,Foo和Bar,我的代码如下所示:
import Foo
import Bar
output = []
a = Foo.get_something()
b = Bar.get_something_else()
output.append(a)
output.append(b)
这两种方法都需要很长时间才能运行,两者都不依赖于另一种方法,因此显而易见的解决方案是并行运行它们。我如何做到这一点,但确保订单是维持的:,无论哪一个先完成,都必须等待另一个完成,然后脚本才能继续。
如果我还没有说清楚的话,请告诉我,我已经尝试使示例代码尽可能简单。
发布于 2014-11-21 11:08:16
import multiprocessing
import Foo
import Bar
results = {}
def get_a():
results['a'] = Foo.get_something()
def get_b():
results['b'] = Bar.get_something_else()
process_a = multiprocessing.Process(target=get_a)
process_b = multiprocessing.Process(target=get_b)
process_b.start()
process_a.start()
process_a.join
process_b.join
这是您的程序的流程版本。
注意:在线程处理中,存在共享的数据结构,因此您必须担心锁定,这将避免对数据的错误操作,此外,正如上面提到的琥珀一样,它还存在一个GIL (Global解释器Lock)问题,而且由于您的两个任务都是CPU密集型的,这意味着由于调用通知线程获取和释放线程,这将花费更多的时间。然而,如果您的任务是I/O密集型的,那么它不会产生太大的影响。
现在,由于进程中没有共享的数据结构,因此不必担心锁,而且不管GIL如何工作,所以您实际上可以享受多处理器的真正功能。
请记住:进程与线程相同,而不需要使用共享数据结构(所有工作都是隔离的,并且都集中在消息传递上)。
看看dabeaz.com,他曾经很好地介绍了并发编程。
发布于 2012-05-06 16:30:25
通常,您会使用threading
来完成这个任务。
首先,为要并行运行的每件事创建一个线程:
import threading
import Foo
import Bar
results = {}
def get_a():
results['a'] = Foo.get_something()
a_thread = threading.Thread(target=get_a)
a_thread.start()
def get_b():
results['b'] = Bar.get_something_else()
b_thread = threading.Thread(target=get_b)
b_thread.start()
然后,要要求两者都完成,请在这两种情况下使用.join()
:
a_thread.join()
b_thread.join()
此时,您的结果将以results['a']
和results['b']
格式显示,因此,如果您想要一个有序列表:
output = [results['a'], results['b']]
注意:如果这两个任务本质上都是CPU密集型的,您可能需要考虑multiprocessing
--因为Python,给定的multiprocessing
进程将只使用一个CPU核心,而multiprocessing
则可以将这些任务分发到不同的核心。但是,它的开销比threading
稍高,因此,如果任务占用的CPU较少,那么它的效率可能就不高。
https://stackoverflow.com/questions/10475448
复制相似问题