Python多线程批量Ping主机IP的脚本

目的:通过写一个简单的脚本学习Python多线程的使用

先编写一个 Ping 主机IP的脚本

ping_ip.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import subprocess
import time

# 记录开始执行的时间
start_time = time.time()

# 定义用来 ping 的254 个 ip
ip_list = ['10.3.1.'+str(i) for i in range(1,255)]

for ip in ip_list:
res = subprocess.call('ping -n 2 -w 5 %s' % ip,stdout=subprocess.PIPE) # linux 系统将 '-n' 替换成 '-c'
print(ip,True if res == 0 else False)

print('执行所用时间:%s' % (time.time() - start_time))

改造成多线程的脚本

ping_threading.py

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
30
31
32
33
import threading
import subprocess
import time
from queue import Queue

# 定义工作线程
WORD_THREAD = 50

# 将需要 ping 的 ip 加入队列
IP_QUEUE = Queue()
for i in range(1,255):
IP_QUEUE.put('10.3.1.'+str(i))

# 定义一个执行 ping 的函数
def ping_ip():
while not IP_QUEUE.empty():
ip = IP_QUEUE.get()
res = subprocess.call('ping -n 2 -w 5 %s' % ip,stdout=subprocess.PIPE) # linux 系统将 '-n' 替换成 '-c'
# 打印运行结果
print(ip,True if res == 0 else False)

if __name__ == '__main__':
threads = []
start_time = time.time()
for i in range(WORD_THREAD):
thread = threading.Thread(target=ping_ip)
thread.start()
threads.append(thread)

for thread in threads:
thread.join()

print('程序运行耗时:%s' % (time.time() - start_time))

运行效果对比

单线程的运行结果

50个线程的运行结果