Operação e manutenção juvenil série python e cisco (4)

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) ~

Operação e manutenção juvenil série python e cisco (4)

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) ~

Operação e manutenção juvenil série python e cisco (4)

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)
    Operação e manutenção juvenil série python e cisco (4)

Acho que você gosta

Origin blog.51cto.com/15082392/2656476
Recomendado
Clasificación