Exploitation et entretien de la série juvénile python et cisco (4)

Exploitation et entretien de la série juvénile python et cisco (4)

Sao Nian Operation and Maintenance Youth

Exploitation et entretien de la série juvénile python et cisco (4)

Description

Ce chapitre utilise le multithreading pour améliorer l'efficacité de l'exécution des scripts. Ce chapitre est également le dernier contenu de cette série d'articles. En repensant aux trois premiers chapitres, d'un simple commutateur à plusieurs commutateurs, puis à la gestion des exceptions, au multi-threading d'aujourd'hui, je pense que c'est assez cohérent ~

Multithreading

Pourquoi utiliser le multithreading? Tous les programmes que nous avons écrits auparavant sont mono-thread et exécutés en série, c'est-à-dire que la commande suivante ne peut être exécutée qu'après l'exécution de la commande précédente, mais évidemment, elle est très efficace quand il y a plus de machines. Nous devrions donc utiliser plusieurs threads pour que le programme s'exécute simultanément.

Comparaison monothread et multithread

  • Temps d'exécution mono-thread
    Jetons un coup d'œil au temps d'exécution du script écrit la dernière fois (film) ~

Exploitation et entretien de la série juvénile python et cisco (4)

Comme vous pouvez le voir, cela prend 28 secondes, ce qui ne représente que trois machines ~ Si 100 machines le sont, ce serait trop long ~

  • Temps d'exécution multi-thread
    Voyons quel est le temps d'exécution multi-thread (film) ~

Exploitation et entretien de la série juvénile python et cisco (4)

Comme vous pouvez le voir, après avoir utilisé le multithreading, la vitesse a beaucoup augmenté ~

Utilisation multi-thread

Utilisation simple du multithreading

L'implémentation multithreading en python utilise la fonction de threading, mais lorsque vous utilisez le multithreading, vous pouvez rencontrer de nombreux problèmes. Jetons d'abord un coup d'œil à l'utilisation simple du multithreading


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

Considérations relatives au multithreading

Lorsque vous utilisez le multi-threading, les ressources seront préemptées parmi les threads et exécutées dans le désordre. Par exemple, lors de la connexion à l'hôte, nous espérons que l'adresse IP cible restera inchangée de la connexion à la connexion. Évidemment, si la cible est connectée Les changements d'adresse IP entraîneront des erreurs de connexion ou des échecs de vérification. tel que


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

L'effet de mise en œuvre est le suivant:


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

À ce stade, nous devons utiliser la méthode RLock. RLock peut verrouiller la valeur dans la plage spécifiée pour garantir que la valeur ne sera pas modifiée. Évidemment, pour notre programme, nous devons verrouiller les données ici dans s.connect (ip, username = user, password = passwd, timeout = 5, look_for_keys = False, allow_agent = False) jusqu'à ce qu'il se connecte avec succès.

  • Comment verrouiller les données
    et comment les verrouiller? Cela nécessite l'utilisation de la méthode RLock, qui est spécifiquement utilisée comme suit:

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

Il suffit d'ajouter le code dont le programme a besoin pour verrouiller la valeur entre le début du verrou et le déverrouillage.


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

Il en va de même pour les commandes. Lorsque la commande est exécutée, la valeur doit être verrouillée, sinon les situations suivantes se produiront:


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

Les données sont toutes foirées ...

Code d'implémentation


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()
  • Effet (film)
    Exploitation et entretien de la série juvénile python et cisco (4)

Je suppose que tu aimes

Origine blog.51cto.com/15082392/2656476
conseillé
Classement