Python 2.7:进程池不工作(无限创建工作进程)
我的多进程池没有正常工作,表现得很奇怪:
from multiprocessing import Pool
import multiprocessing, logging
logger = multiprocessing.log_to_stderr()
logger.setLevel(multiprocessing.SUBDEBUG)
def f(x):
return x*x
if __name__ == '__main__':
pool = Pool(processes=2)
print pool.map(f,range(10))
日志记录器打印出一堆信息,比如:
[DEBUG/MainProcess] created semlock with handle 420
[DEBUG/MainProcess] created semlock with handle 432
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] cleaning up worker 1
[DEBUG/MainProcess] cleaning up worker 0
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] cleaning up worker 1
[DEBUG/MainProcess] cleaning up worker 0
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] cleaning up worker 1
[DEBUG/MainProcess] cleaning up worker 0
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] cleaning up worker 1
[DEBUG/MainProcess] cleaning up worker 0
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] cleaning up worker 1
[DEBUG/MainProcess] cleaning up worker 0
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] cleaning up worker 1
[DEBUG/MainProcess] cleaning up worker 0
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] cleaning up worker 1
[DEBUG/MainProcess] cleaning up worker 0
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] cleaning up worker 1
[DEBUG/MainProcess] cleaning up worker 0
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] cleaning up worker 1
[DEBUG/MainProcess] cleaning up worker 0
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] cleaning up worker 1
[DEBUG/MainProcess] cleaning up worker 0
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] added worker
...一直重复,结果却从来没有打印出来。
为什么会这样呢?
2 个回答
1
顺便说一下,你的代码在我这儿运行得很好。(我用的是Windows 7,64位,Python 2.7.0):
C:\Users\X\Desktop>python mp.py
[DEBUG/MainProcess] created semlock with handle 384
[DEBUG/MainProcess] created semlock with handle 396
[DEBUG/MainProcess] added worker
[DEBUG/MainProcess] added worker
[DEBUG/PoolWorker-2] recreated blocker with handle 12
[DEBUG/PoolWorker-2] recreated blocker with handle 12
[DEBUG/PoolWorker-2] recreated blocker with handle 24
[[DEBUG/PoolWorker-1] recreated blocker with handle 32
DEBUG/PoolWorker-2] recreated blocker with handle 24
[DEBUG/PoolWorker-1] recreated blocker with handle 32
[[DEBUG/PoolWorker-1] recreated blocker with handle 48
INFO/PoolWorker-2] child process calling self.run()
[DEBUG/PoolWorker-1] recreated blocker with handle 48
[INFO/PoolWorker-1] child process calling self.run()
[[INFO/PoolWorker-1] child process calling self.run()
INFO/PoolWorker-2] child process calling self.run()
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[INFO/MainProcess] process shutting down
[DEBUG/MainProcess] running all "atexit" finalizers with priority >= 0
[SUBDEBUG/MainProcess] calling <Finalize object, callback=_terminate_pool, args=(<Queue.Queue instance at 0x01FCCBE8>, <multiprocessing.queues.SimpleQueue object at 0x01F57890>, <multiprocessing.queues.SimpleQueue object
at 0x01FAFBB0>, [<Process(PoolWorker-1, started daemon)>, <Process(PoolWorker-2, started daemon)>], <Thread(Thread-1, started daemon 84304)>, <Thread(Thread-2, started daemon 84900)>, <Thread(Thread-3, started daemon 42
352)>, {}), exitprority=15>
[SUBDEBUG/MainProcess] finalizer calling <bound method type._terminate_pool of <class 'multiprocessing.pool.Pool'>> with args (<Queue.Queue instance at 0x01FCCBE8>, <multiprocessing.queues.SimpleQueue object at 0x01F5789
0>, <multiprocessing.queues.SimpleQueue object at 0x01FAFBB0>, [<Process(PoolWorker-1, started daemon)>, <Process(PoolWorker-2, started daemon)>], <Thread(Thread-1, started daemon 84304)>, <Thread(Thread-2, started daemo
n 84900)>, <Thread(Thread-3, started daemon 42352)>, {}) and kwargs {}
[DEBUG/MainProcess] finalizing pool
[DEBUG/MainProcess] helping task handler/workers to finish
[DEBUG/MainProcess] task handler got sentinel
[DEBUG/MainProcess] removing tasks from inqueue until task handler finished
[DEBUG/MainProcess] task handler sending sentinel to result handler
[DEBUG/MainProcess] result handler got sentinel
[DEBUG/MainProcess] task handler sending sentinel to workers
[[DEBUG/MainProcess] ensuring that outqueue is not full
DEBUG/PoolWorker-1] worker got sentinel -- exiting
[[[DEBUG/PoolWorker-2] worker got sentinel -- exiting
DEBUG/MainProcess] task handler exiting
DEBUG/PoolWorker-1] worker got sentinel -- exiting
[[DEBUG/PoolWorker-1] worker exiting after 5 tasks
[[DEBUG/PoolWorker-1] worker exiting after 5 tasks
DEBUG/PoolWorker-2] worker got sentinel -- exiting
[INFO/PoolWorker-1] process shutting down
DEBUG/MainProcess] terminating workers
[DEBUG/MainProcess] result handler exiting: len(cache)=0, thread._state=2
[DEBUG/MainProcess] worker handler exiting
[DEBUG/MainProcess] joining task handler
[DEBUG/MainProcess] joining result handler
[DEBUG/MainProcess] joining pool workers
[DEBUG/MainProcess] running the remaining "atexit" finalizers
C:\Users\X\Desktop>
3
这个问题是因为在Windows系统上使用PyScripter(版本2.5.3.0)运行代码导致的。而从命令行直接运行代码就没有问题。