Operación y mantenimiento juvenile series python y cisco (4)

Operación y mantenimiento juvenile series python y cisco (4)

Jóvenes de Operación y Mantenimiento de Sao Nian

Operación y mantenimiento juvenile series python y cisco (4)

Descripción

Este capítulo utiliza subprocesos múltiples para mejorar la eficiencia de la ejecución del script Este capítulo también es el último contenido de esta serie de artículos. Mirando hacia atrás en los primeros tres capítulos, desde un solo conmutador a varios conmutadores y luego al manejo de excepciones, hasta el multihilo actual, creo que es bastante consistente ~

Multihilo

¿Por qué utilizar subprocesos múltiples? Todos los programas que escribimos antes son de un solo subproceso y se ejecutan en serie, es decir, el siguiente comando solo se puede ejecutar después de que se ejecute el comando anterior, pero obviamente, es muy eficiente cuando hay más máquinas. Por lo tanto, deberíamos usar varios subprocesos para que el programa se ejecute al mismo tiempo.

Comparación de un solo subproceso y de varios subprocesos

  • Tiempo de ejecución de un solo subproceso
    Echemos un vistazo al tiempo de ejecución del script escrito la última vez (imagen en movimiento) ~

Operación y mantenimiento juvenile series python y cisco (4)

Como puede ver, se necesitan 28 segundos, que son solo tres máquinas ~ Si 100 máquinas son, sería demasiado tiempo ~

  • Tiempo de ejecución de subprocesos múltiples
    Veamos cuál es el tiempo de ejecución de subprocesos múltiples (imagen en movimiento) ~

Operación y mantenimiento juvenile series python y cisco (4)

Como puede ver, después de usar subprocesos múltiples, la velocidad ha aumentado mucho ~

Uso multiproceso

Uso simple de subprocesos múltiples

La implementación de subprocesos múltiples en Python usa la función de subprocesos, pero cuando se utilizan subprocesos múltiples, puede encontrar muchos problemas. Primero, echemos un vistazo al uso simple de subprocesos múltiples.


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() #运行

Consideraciones para el subproceso múltiple

Cuando se usa multi-threading, los recursos se apropiarán entre los hilos y se ejecutarán fuera de orden. Por ejemplo, al conectarse al host, esperamos que la IP de destino permanezca sin cambios desde la conexión a la conexión. Obviamente, si el destino está conectado Los cambios de IP provocarán errores de conexión o fallas de verificación. 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()

El efecto de implementación es el siguiente:


[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]# 

En este momento, necesitamos usar el método RLock. RLock puede bloquear el valor dentro del rango especificado para garantizar que el valor no se modifique. Obviamente, para nuestro programa, tenemos que bloquear los datos aquí en s.connect (ip, username = user, password = passwd, timeout = 5, look_for_keys = False, allow_agent = False) hasta que se conecte correctamente.

  • ¿Cómo bloquear los datos
    y cómo bloquearlos? Esto requiere el uso del método RLock, que se usa específicamente de la siguiente manera:

lock = threading.RLock()  # 实例化
lock.acquire() # 开始锁定
lock.release() # 解锁

Solo necesitamos agregar el código que el programa necesita para bloquear el valor entre el inicio del bloqueo y el desbloqueo.


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

Lo mismo ocurre con los comandos. Cuando se ejecuta el comando, el valor debe bloquearse, de lo contrario se producirán las siguientes situaciones:


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

Los datos están todos desordenados ...

Código de implementación


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()
  • Efecto (imagen en movimiento)
    Operación y mantenimiento juvenile series python y cisco (4)

Supongo que te gusta

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