2016-12-03 40 views
1

我最近开始学习python中的多处理。对此我有一些问题。下面的代码显示我的例子:关于多处理的几个问题。池

import multiprocessing 
from time import * 

def func(n): 
    for i in range(100): 
     print(i, "/ 100") 
     for j in range(100000): 
      a=j*i 
      b=j*i/2 

if __name__ == '__main__': 
    #Test with multiprosessing 
    pool = multiprocessing.Pool(processes=4) 
    t1 = clock() 
    pool.map(func, range(10)) 
    pool.close() 
    t2 = clock() 
    print(t2-t1) 
    #Test without multiprocessing 
    func(range(10)) 
    t3 = clock() 
    print(t3-t2) 
  1. 此代码是否使用CPU的四个核还是我犯了一个错误?
  2. 为什么没有多处理的运行时间如此之快?有错误吗?
  3. 为什么print命令在使用多处理时不起作用?

回答

4

它一次向进程池提交四个进程。您的多处理示例运行func十次,而普通呼叫仅运行一次。另外,启动进程有一些运行时间开销。这些可能解释了运行时间的差异。

我认为一个更简单的例子是有启发性的。 func现在睡五秒钟,然后打印输出n以及时间。

import multiprocessing 
import time 

def func(n): 
    time.sleep(5) 
    print([n, time.time()]) 

if __name__ == '__main__': 
    #Test with multiprosessing 
    print("With multiprocessing") 
    pool = multiprocessing.Pool(processes=4) 
    pool.map(func, range(5)) 
    pool.close() 

    #Test without multiprocessing 
    print("Without multiprocessing") 
    func(1) 

pool.map(func, range(5))运行func(0)func(1),...,func(4)

此输出

With multiprocessing 
[2, 1480778015.3355303] 
[3, 1480778015.3355303] 
[1, 1480778015.3355303] 
[0, 1480778015.3355303] 
[4, 1480778020.3495753] 
Without multiprocessing 
[1, 1480778025.3653867] 

注意,第一四个是同时输出,并且没有严格的秩序。第五个(n == 4)在五秒钟之后得到输出,这很有意义,因为我们有四个进程池,并且只有在前四个进程完成后才能开始。