关于多处理的几个问题。池
问题描述:
我最近开始学习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)
- 此代码是否使用CPU的四个核还是我犯了一个错误?
- 为什么没有多处理的运行时间如此之快?有错误吗?
- 为什么
print
命令在使用多处理时不起作用?
答
它一次向进程池提交四个进程。您的多处理示例运行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
)在五秒钟之后得到输出,这很有意义,因为我们有四个进程池,并且只有在前四个进程完成后才能开始。