0%

python获取进程池中运行的进程数量

使用python编程时,为了充分利用cpu资源,我们会用到multiprocessing模块来创建多个进程执行任务,当任务数量较多时,我们还可以创建一个进程池,将任务异步添加到池中。在一般情况下,我们提前知道了有多少个任务,可以在创建进程池后一次性将任务添加到进程池中。但是如果我们使用多台服务器来处理动态数量的任务,则可以定时获取进程池中正在运行的进程数量,以实现动态的管理。

python的官方文档中没有提供获取进程池中正在运行的进程数量的方法,但是通过观察创建出来的进程池对象后,发现进程池对象的_cache属性可以用于表示当前池中正在运行的进程的情况,其长度课可以代表进程池中正在运行的进程数量。下面是一个简单的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python
# -*-coding:utf8-*-

import time
from multiprocessing import Pool

def test_sleep(sleep_time):
time.sleep(sleep_time)
return 0

pool = Pool(processes=3)
pool.apply_async(test_sleep, (3,))
pool.apply_async(test_sleep, (1,))
pool.apply_async(test_sleep, (5,))

while True:
time.sleep(1)
process_count = len(pool._cache)
if process_count != 0:
print "%s processes running" % len(pool._cache)
else:
print "all processes are finished"
break

pool.close()
pool.join()

在上面的示例中,提供了一个简单的test_sleep函数,将根据提供的参数来sleep。我们在创建了一个容量为3的进程池后,向池中异步提交了3个任务,随后每隔一秒钟检查一次池中运行的程序的数量,当所有的程序都运行结束后程序退出。运行该脚本后将会打印如下的结果:

1
2
3
4
5
6
knktc-rbmp:tmp knktc$ python test_pool.py 
3 processes running
2 processes running
1 processes running
1 processes running
all processes are finished

可以看出,已经可以监控进程中程序的情况了。此时就可以动态地向池中加入更多的任务了。

如果我的文字帮到了您,那么可不可以请我喝罐可乐?