2

我是 Python 中多处理的新手。我有一个简单的程序,例如:

class test:
    ...
    def func():
        return something

inst1 = test(init1, ...)
inst2 = test(init2, ...)
inst3 = test(init3, ...)

x = []
while(some_condition):
    a = inst1.func()
    b = inst2.func()
    c = inst3.func()
    x.append(do_something(a, b, c))

func 是 CPU 密集型的,每次调用时都会返回不同的值。

我有一台装有 2 个 8 核 CPU 的机器,安装了 Ubuntu 和 Python 2.6.5(不幸的是,无法更新),还有另一台装有单个 i7 处理器和 Python 2.7.5 的机器(也无法更新)。我也无法安装新软件包。

我相信如果同时运行所有 3 种方法,我可以获得一些性能(理论上操作系统应该将它们分配给不同的内核),但我不确定如何继续。对于多处理,文档充其量是神秘的。

您能否指点我一些例子或就如何实现这一点给我一些建议?谢谢

4

2 回答 2

0

好吧,这与文档中的示例非常接近……但我认为使用 aPool比使用显式进程更容易,甚至Futures比使用简单池更容易。另外,futures模块的文档比multiprocessing文档简单。所以,让我们这样做:

x = []
with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor:
    while some_condition:
        a = executor.submit(func1)
        b = executor.submit(func2)
        c = executor.submit(func3)
        concurrent.futures.wait((a, b, c))
        x.append(do_something(a.result(), b.result(), c.result()))

如果您使用的是 Python 2.5-3.1,则 stdlib 中不会有此模块,因此您需要安装backport


multiprocessing.Process为了比较,下面是对每个函数使用显式的样子:

def background(f):
    q = multiprocessing.Queue()
    def wrapped(q):
        q.put(f())
    p = multiprocess.Process(target=wrapped, args=q)
    p.start()
    return p, q

x = []
while some_condition:
    pa, qa = background(func1)
    pb, qb = background(func2)
    pc, qc = background(func3)
    pa.join()
    pb.join()
    pc.join()
    x.append(do_something(qa.get(), qb.get(), qc.get())
于 2013-08-30T22:35:47.177 回答
0

Doug Hellmans 的“本周模块”经常有很好的例子:

http://pymotw.com/2/multiprocessing/basics.html

他关于标准图书馆的书也物有所值。

于 2013-08-30T22:00:39.013 回答