python进程池

python自2.6开始提供了多进程模块multiprocessing,进程池使用multiprocessing.pool,pool的构造如下:

```
multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]])
```

* processes: 表示pool中进程的数目,默认地为当前CPU的核数。
* initializer: 表示新进程的初始化函数。
* initargs: 表示新进程的初始化函数的参数。
* maxtasksperchild: 表示每个进程执行task的最大数目

```
apply_async(func[, args[, kwds[, callback]]])
```

主进程循环运行过程中不等待apply_async的返回结果,在主进程结束后,即使子进程还未返回整个程序也会退出。虽然 apply_async是非阻塞的,但其返回结果的get方法却是阻塞的,如使用result.get()会阻塞主进程。
如果我们对返回结果不感兴趣, 那么可以在主进程中使用pool.close与pool.join来防止主进程退出。注意join方法一定要在close或terminate之后调用。

```
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os
import multiprocessing
import time

def func(msg):
print msg,os.getpid()
time.sleep(1)
return "done" + msg

if __name__ == "__main__":
pool = multiprocessing.Pool(processes=12)
result = []
for i in xrange(10):
msg = "hello %d" %(i)
result.append(pool.apply_async(func, (msg, )))
pool.close()
pool.join()
print "wait"
for res in result:
print res.get()
print "Sub-process done.";
```

标签:Linux, Python

评论已关闭