Operação e manutenção juvenil série python e cisco (4)
Operação e Manutenção São Nian Jovens
Operação e manutenção juvenil série python e cisco (4)
Descrição
Este capítulo usa multithreading para melhorar a eficiência da execução do script.Este capítulo também é o último conteúdo desta série de artigos. Olhando para trás, para os três primeiros capítulos, de um único switch para vários switches e, em seguida, para o tratamento de exceções, até o multi-threading de hoje, acho que é bastante consistente ~
Multithreading
Por que usar multithreading? Todos os programas que escrevemos anteriormente são single-threaded e executados em série, ou seja, o próximo comando só pode ser executado depois de executado o comando anterior, mas obviamente é muito eficiente quando há mais máquinas. Portanto, devemos usar vários threads para fazer o programa executar simultaneamente.
Comparação single-threaded e multi-threaded
- Tempo de execução de thread único
Vamos dar uma olhada no tempo de execução do script escrito da última vez (filme) ~
Como você pode ver, leva 28s, que são apenas três máquinas ~ Se 100 máquinas fossem, seria muito longo ~
- Tempo de execução multi-threaded
Vamos ver qual é o tempo de execução multi-threaded (filme) ~
Como você pode ver, depois de usar multithreading, a velocidade aumentou muito ~
Uso multiencadeado
Uso simples de multithreading
A implementação multithreading em python usa a função threading, mas ao usar multithreading, você pode encontrar muitos problemas. Vamos dar uma olhada no uso simples de multithreading primeiro
import threading # 导入多线程模块
import time
def run(num): # 定义函数(必须)
print 'this is the thread ', num
time.sleep(1)
for i in range(20):
t = threading.Thread(target=run,args=(i,)) # 实例化,target表示需要使用多线程的函数名,args为传入的参数,必须为元组,所以如果只有一个参数,需要加,号
t.start() #运行
Considerações para multithreading
Ao usar multi-threading, os recursos serão interrompidos entre os threads e executados fora de ordem. Por exemplo, ao se conectar ao host, esperamos que o IP de destino permaneça inalterado da conexão para a conexão. Obviamente, se o destino estiver conectado As alterações de IP causarão erros de conexão ou falhas de verificação. tal como
import paramiko
import socket
import time
import threading
starttime = time.time()
user = 'yunwsn'
passwd = '123456'
s = paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
IP = file('IP.txt','rb')
def run(ip): # 定义函数
try:
s.connect(ip,username=user,password=passwd,timeout=5,look_for_keys=False,allow_agent=False)
print '[ \033[0;32m success\033[0m ] login %s ' %ip
cmd = s.invoke_shell()
command = file('command.txt','rb')
for command in command.xreadlines():
cmd.send(command)
time.sleep(0.3)
output = cmd.recv(65535)
print output
cmd.close()
except paramiko.ssh_exception.NoValidConnectionsError:
print '[ \033[0;31m failed \033[0m ] Unable to connect to %s ' % ip
except socket.error,err:
print '[ \033[0;31m failed \033[0m ] %s to %s' %(err,ip)
except paramiko.ssh_exception.AuthenticationException:
print '[ \033[0;31m failed \033[0m ] Authentication failed on %s' % ip
for i in IP.xreadlines(): # 循环IOP
t = threading.Thread(target=run, args=(i,)) # 多线程实例化
t.start() # 启用多线程
IP.close()
O efeito de implementação é o seguinte:
[root@yunwei cisco]# python ywsn_p_c_lab4.py
[ failed ] Authentication failed on 192.168.108.252
[ failed ] Authentication failed on 192.168.108.253
[ failed ] Authentication failed on 192.168.108.251
[root@yunwei cisco]#
Neste momento, precisamos usar o método RLock. RLock pode bloquear o valor dentro do intervalo especificado para garantir que o valor não seja modificado. Obviamente, para nosso programa, temos que bloquear os dados aqui em s.connect (ip, username = user, password = passwd, timeout = 5, look_for_keys = False, allow_agent = False) até que ele se conecte com sucesso.
- Como bloquear os dados
e como bloqueá-los? Isso requer o uso do método RLock, que é usado especificamente da seguinte maneira:
lock = threading.RLock() # 实例化
lock.acquire() # 开始锁定
lock.release() # 解锁
Precisamos apenas adicionar o código que o programa precisa para bloquear o valor entre o início do bloqueio e o desbloqueio.
def run(ip):
try:
lock.acquire()
s.connect(ip,username=user,password=passwd,timeout=5,look_for_keys=False,allow_agent=False)
lock.release()
print '[ \033[0;32m success\033[0m ] login %s ' %ip
O mesmo é verdade para os comandos. Quando o comando é executado, o valor precisa ser bloqueado, caso contrário, as seguintes situações ocorrerão:
Sw2(config)#
name V80
Sw1(config-vlan)#
vlan 100
Sw3(config-vlan)#
int e0/1
Sw2(config-if)#
vlan 90
Sw1(config-vlan)#
name V100
Sw3(config-vlan)#
switchport mode access
Sw2(config-if)#
name V90
Sw1(config-vlan)#
exit
Sw3(config)#
switchport trunk encapsulation dot1q
Os dados estão todos bagunçados ...
Código de implementação
import paramiko
import socket
import time
import threading
user = 'yunwsn'
passwd = '123456'
s = paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
IP = file('IP.txt','rb')
lock = threading.RLock()
def run(ip):
try:
lock.acquire()
s.connect(ip,username=user,password=passwd,timeout=5,look_for_keys=False,allow_agent=False)
lock.release()
print '[ \033[0;32m success\033[0m ] login %s ' %ip
cmd = s.invoke_shell()
command = file('command.txt','rb')
for command in command.xreadlines():
lock.acquire()
cmd.send(command)
lock.release()
time.sleep(0.3)
output = cmd.recv(65535)
print output
cmd.close()
except paramiko.ssh_exception.NoValidConnectionsError:
print '[ \033[0;31m failed \033[0m ] Unable to connect to %s ' % ip
except socket.error,err:
print '[ \033[0;31m failed \033[0m ] %s to %s' %(err,ip)
except paramiko.ssh_exception.AuthenticationException:
print '[ \033[0;31m failed \033[0m ] Authentication failed on %s' % ip
for i in IP.xreadlines():
t = threading.Thread(target=run, args=(i,))
t.start()
IP.close()
- Efeito (filme)