没有经过多线程或者多进程处理脚本实行效率非常低下
import subprocess
def ping(ip):
result = subprocess.run(
" ping -c 2 %s &>/dev/null" %ip ,shell=True )
if result.returncode == 0:
print("%s:UP" %ip)
else:
print("%s:down" %ip)
if __name__ == '__main__':
ips = ["192.168.100.%s" %i for i in range (1,255)]
for ip in ips:
ping(ip)
通过多进程处理后脚本效率提高很多。
os.frok() 是创建子进程语句,而 pid = 是赋值语句,所以在创建完子进程后,下一句为运行赋值语句。进程调用fork函数时,操作系统会新建一个子进程,它本质上与父进程完全相同。操作系统是将当前的进程(父进程)复制了一份(子进程),然后分别在父进程和子进程内返回。子进程接收返回值为0,此时pid=0,而父进程接收子进程的pid作为返回值。调用fork函数后,两个进程并发执行同一个程序,首先执行的是调用了fork之后的下一行代码。
[root@localhost python_test]# cat frping.py
#!/usr/bin/env python3
import subprocess
import os
#定义函数,允许ping任何主机,ping函数需要给IP作为参数
def ping(host):
result = subprocess.run(
'ping -c2 %s &> /dev/null' %host , shell=True
)
#定义ping命令的变量,返回值0:正常,返回值1:ping不通
if result.returncode == 0:
print('%s 主机可达' %host)
else:
print('%s 主机不可达' %host)
if __name__ == '__main__':
#生成整个网段的IP列表[192.168.88.0]
ips = ['192.168.88.%s' %i for i in range(255)]
for ip in ips:
pid = os.fork() # 父进程负责生成子进程
if pid ==0:
ping(ip) # 子进程负责调用ping函数
exit()
多线程机动
多线程特点
什么是进程
什么是线程:
python相关线程模块
下面是线程案例:
import subprocess
import threading
def ping (ip):
result = subprocess.run('ping -c2 %s &>/dev/null' %ip ,shell=True)
if result.returncode == 0:
print('%s UP'%ip)
else:
print('%s Down' %ip)
if __name__=='__main__':
ips = ('192.168.100.%i' %i for i in range(1,255))
for ip in ips:
thread = threading.Thread(target=ping,args=(ip,)) #创建一个线程
thread.start()##启动线程,相当target(*args)
OP面对象写法:
import subprocess
import threading
class Ping:
def __call__(self, ip):
result = subprocess.run('ping -c2 192.168.100.%s &>/dev/null' %ip,shell=True)
if result.returncode == 0:
print('%s Up' %ip)
else:
print('%s Down' %ip)
if __name__ == '__main__':
ips = ('192.168.100.%s' %i for i in range(1,255))
for ip in ips:
#target是Ping的实例,该对象具有调用功能
Thread = threading.Thread(target=Ping(),args=(ip,))
Thread.start() #调用target(*args)
op面向对象另外写法:
import subprocess
import threading
class Ping:
def __init__(self,ip):
self.ip = ip
def __call__(self):
result = subprocess.run('ping -c2 192.168.100.%s &>/dev/null' %self.ip,shell=True)
if result.returncode == 0:
print('%s UP' %self.ip)
else:
print('%s Down' %self.ip)
if __name__ == '__main__':
ips = ('192.168.100.%s' %i for i in range(1,255))
for ip in ips:
Thread = threading.Thread(target=Ping(ip),)
Thread.start()