2013-12-20 40 views
2

我使用多处理的过程中python2.7创建太过程,如下图所示:约多处理过程

p1 = Process(target=build_sql_s, args=(Scopes,)) 
p2 = Process(target=build_sql_o, args=(Orders,)) 
p1.start() 
p2.start() 
p1.join() 
p2.join() 

ScopesOrders两种list varbuild_sql_sbuild_sql_ofunctions。 当我运行这个程序,cpup170%,但CPU和内存p20%直到p1的工作是在一台计算机与8 core ... 为什么做所有的时间?不应该多处理的过程使用计算机的不同核心吗?

+0

我没跟着你〜你能更清楚地解释一下吗? –

+2

您的清单“订单”有多久可能是工作很快完成。通常Process应该使用另一个核心。但是你应该给我们更多关于你的代码的细节:你的代码是否在if __main__? – Alexis

+0

是的,它是在一个主要的。 Scopes的规模是几十万,Orders的规模几乎是四百万。有没有可能关于Scopes的工作很快完成?但它仍然在顶层命令的进程列表中。 –

回答

0

我没有使用明确.start().join()为您呈现,但我已经使用multiprocessing.Pool()有令人满意的结果。 Pool()设置了一个工作进程池,默认情况下每个处理器核心一个,然后.map()方法使它们工作。我建议你试试看。

这是我刚写的一个简单的程序,用于演示如何使用multiprocessing.Pool().map()

在Python 2.7和Python 3.3下测试。

import multiprocessing as mp 
import time 

def is_odd(n): 
    return bool(n%2) 

def hailstone(n): 
    """ 
    Compute the Hailstone sequence, as described in: 
    http://en.wikipedia.org/wiki/Collatz_conjecture 
    """ 
    steps = 0 
    while n > 1: 
     steps += 1 
     if is_odd(n): 
      n = 3*n + 1 
     else: 
      n = n//2 
    return steps 


def slow(limit): 
    steps = sum(hailstone(n) for n in range(limit)) 
    #print("n: {} steps: {}".format(n, steps)) 
    return (limit, steps) 

LIMIT = 2000 

start = time.time() 
results0 = [slow(n) for n in range(LIMIT)] 
stop = time.time() 
elapsed0 = stop - start 

print("Single-threaded time: {:.2f} seconds".format(elapsed0)) 

# note we are including time to set up the Pool() in the elapsed time 
start = time.time() 
p = mp.Pool() 
results1 = p.map(slow, range(LIMIT)) 
stop = time.time() 
elapsed1 = stop - start 

results1.sort() 

print("Multiprocessing time: {:.2f} seconds".format(elapsed1)) 

assert results0 == results1 

multiprocessing.Pool()中运行时,我几乎精确地看到了4倍加速。使用AMD FX-8350(内部具有4“推土机模块”)进行测试。

+0

非常感谢,这听起来像个好主意。 –

+0

进程是另一种使用多核的方式,我认为一开始就是错误的,它同时使用多核,我误解了我所看到的。你很善良,我很乐意接受你的建议。 –

0

核心选择和进程分布是操作系统的问题,而不是你的代码。多线程并不意味着u的分离你的执行代码的CPU,也多模块多处理太..

+0

我已经尝试过一个类中的多处理(从多处理继承),它运行良好。这是为什么我的程序不能按预期执行的问题吗? –

0

嗯,我想我现在就看到你的问题了。

你必须知道处理器不共享相同的内存。因此,当您创建并启动一个给它一个(真正)大的列表的新进程时,列表首先被复制。这可能需要一些时间...

一种可能性,甚至更多如果您的数据(=列表)是只读的,则使用共享内存。看看那里:http://docs.python.org/3.3/library/multiprocessing.html#module-multiprocessing.sharedctypes with multiprocessing.Array