ASPONE.CN
苦逼

python 线程/进程池 multiprocessing

多线程/进程,嗯,要多少线程/进程才合适?总不能无限多吧,so 线程/进程池出现了!

multiprocessing 作为 threadpool 的替代方案出现了,因为 threadpool 太老了。

可以看看介绍:https://pypi.python.org/pypi/threadpool

import time
import multiprocessing


def task(s):
	print 'TASK:', s, 'START'
	time.sleep(1)
	print 'TASK:', s, 'END'
	return 'TASK:', s

rs = []

if __name__ == "__main__":
	pool = multiprocessing.Pool(processes = multiprocessing.cpu_count())

	for i in xrange(10):
		r = pool.apply_async(task, (i,))
		rs.append(r)

	pool.close()
	pool.join()

	for r in rs:
		print(r.get())


创建一个 CPU 核数的进程池,用 apply_async 异步方式送进进程池。

apply_async(func[, args[, kwds[, callback]]]) 它是非阻塞,apply(func[, args[, kwds]])是阻塞的

close()    关闭pool,使其不在接受新的任务

join()    主进程阻塞,等待子进程的退出, join方法要在close或terminate之后使用

terminate()    结束工作进程,不在处理未完成的任务

get()   取回返回值


解释完了,看结果

# python mulprcs.py
TASK: 0 START
TASK: 1 START
TASK: 2 START
TASK: 3 START
TASK: 2 END
TASK: 4 START
TASK: 0 END
TASK: 5 START
TASK: 1 END
TASK: 6 START
TASK: 3 END
TASK: 7 START
TASK: 4 END
TASK: 8 START
TASK: 5 END
TASK: 9 START
TASK: 6 END
TASK: 7 END
TASK: 8 END
TASK: 9 END
('TASK:', 0)
('TASK:', 1)
('TASK:', 2)
('TASK:', 3)
('TASK:', 4)
('TASK:', 5)
('TASK:', 6)
('TASK:', 7)
('TASK:', 8)
('TASK:', 9)


注意:

如果 pool = multiprocessing.Pool(processes = multiprocessing.cpu_count()) 放在可导入的位置,也就是在 if __name__ == "__main__": 之外,会报如下错误:

AttributeError: 'module' object has no attribute 'task'

Copyright © 2016 ASPONE.CN. All Rights Reserved. 京ICP备18038662号