为什么使用 Python 的多处理模块似乎不能按顺序处理?
Why does this use of Python's multiprocessing module not seem to process sequentially?
我正在尝试学习使用 Python 的多处理模块。作为第一个测试,我想我会同时 运行 四个 15 秒的进程。我写了这个模块,我称之为 "multiPtest.py"::
import time
import timeit
import multiprocessing
def sleepyMe(napTime):
time.sleep(napTime)
print "Slept %d secs" % napTime
def tester(numTests):
#Launch 'numTests' processes using multiProcessing module
for _ in range(numTests):
p = multiprocessing.Process(target=sleepyMe(15))
p.start() #Launch an 'independent' process
#p.join() ##Results identical with or without join
def multiTester():
#Time running of 4 processes
totTime = timeit.Timer('tester(4)', setup = 'from multiPtest import tester').repeat(1,1)
print "Total = ", totTime[0]
但是,当我 运行 时,我得到了这些结果:
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from multiPtest import *
>>> multiTester()
Slept 15 secs
Slept 15 secs
Slept 15 secs
Slept 15 secs
Total = 60.0739970207
我原以为总时间会接近 15 秒,而不是 60 秒。我知道我有 4 个内核,因为我查看了 /proc/cpuinfo:
~/Projects/PythonProjects$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 60
model name : Intel(R) Core(TM) i7-4900MQ CPU @ 2.80GHz
stepping : 3
microcode : 0x17
cpu MHz : 800.000
cache size : 8192 KB
physical id : 0
siblings : 8
core id : 0
cpu cores : 4
...
为什么我看不到这 4 个睡眠者同时睡觉?我不应该能够创建和启动新进程而其他人是 asleep/busy 吗?我是不是对多处理、Python 的多处理模块或其他东西有误解?
在行
p = multiprocessing.Process(target=sleepyMe(15))
你实际上已经调用 sleepyMe
并使用结果 (None
) 作为 target
参数的值,因此等待 15秒。尝试
p = multiprocessing.Process(target=sleepyMe, args=(15, ))
并将函数修改为 join()
所有子进程 在 for 循环 之后,否则它会立即 return 并且你最终会得到一个总数时间接近于零..
我正在尝试学习使用 Python 的多处理模块。作为第一个测试,我想我会同时 运行 四个 15 秒的进程。我写了这个模块,我称之为 "multiPtest.py"::
import time
import timeit
import multiprocessing
def sleepyMe(napTime):
time.sleep(napTime)
print "Slept %d secs" % napTime
def tester(numTests):
#Launch 'numTests' processes using multiProcessing module
for _ in range(numTests):
p = multiprocessing.Process(target=sleepyMe(15))
p.start() #Launch an 'independent' process
#p.join() ##Results identical with or without join
def multiTester():
#Time running of 4 processes
totTime = timeit.Timer('tester(4)', setup = 'from multiPtest import tester').repeat(1,1)
print "Total = ", totTime[0]
但是,当我 运行 时,我得到了这些结果:
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from multiPtest import *
>>> multiTester()
Slept 15 secs
Slept 15 secs
Slept 15 secs
Slept 15 secs
Total = 60.0739970207
我原以为总时间会接近 15 秒,而不是 60 秒。我知道我有 4 个内核,因为我查看了 /proc/cpuinfo:
~/Projects/PythonProjects$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 60
model name : Intel(R) Core(TM) i7-4900MQ CPU @ 2.80GHz
stepping : 3
microcode : 0x17
cpu MHz : 800.000
cache size : 8192 KB
physical id : 0
siblings : 8
core id : 0
cpu cores : 4
...
为什么我看不到这 4 个睡眠者同时睡觉?我不应该能够创建和启动新进程而其他人是 asleep/busy 吗?我是不是对多处理、Python 的多处理模块或其他东西有误解?
在行
p = multiprocessing.Process(target=sleepyMe(15))
你实际上已经调用 sleepyMe
并使用结果 (None
) 作为 target
参数的值,因此等待 15秒。尝试
p = multiprocessing.Process(target=sleepyMe, args=(15, ))
并将函数修改为 join()
所有子进程 在 for 循环 之后,否则它会立即 return 并且你最终会得到一个总数时间接近于零..