简单的将函数变为多线程执行

在工作中需要ping大量主机检测状态,为了方便,采用python的multiprocess的进程池,方便的将现有函数改造成多进程运行:

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
27
28
29
# _*_coding:utf-8_*_

import subprocess
from multiprocessing import Pool


def getStatusList(ip_list):
status = {}
t_list = tuple()
pool = Pool(processes=len(ip_list))
for ip in ip_list:
p = pool.apply_async(ping, (ip,))
t_list += (p,)
pool.close()
pool.join()

for result in t_list:
status.update(result.get())

return status


def ping(ip):
status = subprocess.call(["ping", "-q", "-c 2", "-W 1", ip], shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
return {ip: status}


if __name__ == '__main__':
print(getStatusList(['127.0.0.1', '192.168.0.1', '192.168.0.2', '192.168.0.3', '192.168.0.4', '192.168.0.5', '192.168.0.6']))

这里使用了Pool对象,异步调用了ping,可以方便的将现有函数进行改造。

另外,由于GIL的存在,python的多线程无法合理的使用cpu,如果是CPU密集型程序,还是使用多线程更为合理,multiprocess的调用也更加方便。