关于多处理的几个问题.Pool

时间:2016-12-03 14:21:08

标签: python multiprocessing pool

我最近开始学习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命令不起作用?

1 个答案:

答案 0 :(得分: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)在五秒后得到输出,这是有意义的,因为我们有一个包含四个进程的池,并且只有在前四个进程完成后才能启动。