Параллельные потоки / Telnet с Python: нельзя использовать len (список)> 1000 - PullRequest
0 голосов
/ 08 июня 2018

У меня есть программа, которая получит список, содержащий IP-адреса маршрутизаторов.Для каждого из них подключение по Telnet будет запускаться через SSH-туннель.

Это хорошо работает.За исключением того факта, что если список больше 1000 адресов (т.е. 1250), будут учитываться только первые 1000 элементов.Первая 1000 будет в порядке, но остальные 250 даже не будут учитываться.

Итак, во-первых, псевдокод:

  1. открыть ssh-соединение с сервером и вызвать sshтуннель.вернуть локальный порт
  2. открыть соединение telnet с удаленным маршрутизатором, используя локальный порт
  3. сделать что-то
  4. закрыть telnet
  5. закрыть ssh

Число параллельных соединений является фиксированным целым числом (10, 20, 30 и т. Д.).Я протестировал код с 40 параллельными соединениями.

Это сам код.

import ipaddress as ip
import threading
from multiprocessing.pool import ThreadPool,Pool
import paramiko
from sshtunnel import SSHTunnelForwarder

class connTelnet(threading.Thread):

    def __init__(self,thrdNum, script, loopback):
        threading.Thread.__init__(self)
        self.num            = thrdNum
        self.script         = script
        self.loopback       = loopback
        self.strConn        = "Con-" + str(self.num) + "| "

def run(self):
    self.s = self.sshStart(self.strConn,self.loopback)
    self.sshStatus = self.s[0]
    self.sshServer = self.s[1]
    self.localPort = self.s[2]

    if self.sshStatus == 1:
        print(self.strConn + ": Quitting....")
        self.sshStop(self.sshServer,self.strConn,self.num)

def sshStart(self,strConn,loopback):
    try:
        sshServer = SSHTunnelForwarder(
            (IP, PORT),
            ssh_username = USER,
            ssh_password = PASSWORD,
            remote_bind_address = (loopback, 23),
        )
        sshServer.start()
        localPort = sshServer.local_bind_port
        sshStatus = 1
        print(strConn + "SSH Tunnel Up: " + loopback + ":" + str(localPort))
    except:
        print(strConn + "Error SSH Tunnel")
        sshStatus = -1
        sshServer = -1
        localPort = -1

    return(sshStatus,sshServer,localPort)           

def sshStop(self,sshServer,strConn,num):
        sshServer.stop()
            print(strConn + "SSH" + str(num) + " stopped ...")

def run_mi_thread(i, script, loopback):
    connTelnet(i, script, loopback).run()

    #### Main ####
if __name__ == '__main__':

    progNumThreads = 40
    n = 1010
    a = '99.0.0.0'
    ipaddress = ip.IPv4Address(a)
    routers = [(ipaddress+x).exploded for x in range(1,n)]

    threads_list    = Pool(progNumThreads)
    for i, router in enumerate(routers):

        # We generate the config file
        script     = "blablabla\n"
        threads_list.apply_async(run_mi_thread, args=(i, script, router))

    threads_list.close()
    threads_list.join()

Итак, как уже было сказано, если len(threads_list) <= 1000, все маршрутизаторы будут обслуживаться.Если len(threads_list) > 1000, будут обслуживаться только первые 1000 маршрутизаторов.

Более того: очень любопытно, что число равно 1000. И оно всегда одинаково. Не меняется с несколькими прогонамипрограммы.

Связано ли это с количеством параллельных сокетов?количество SSH-туннелей?

Спасибо!

...