关于multiprocessing.Pool的几个问题

Several questions about 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 命令在使用多处理时不起作用?

它确实会一次向您的进程池提交四个进程。您的多处理示例是 运行ning func 十次,而普通调用是 运行ning 一次。此外,启动进程有一些 运行 时间开销。这些可能是造成 运行 次差异的原因。

我认为一个更简单的例子很有启发性。 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)) 运行s 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) 在五秒后获得输出,这是有道理的,因为我们有一个包含四个进程的池,并且它只能在前四个完成后才能启动。