与Python并行线程/ telnet:不能使用len(list)> 1000

时间:2018-06-08 04:45:31

标签: python-3.x threadpool python-multithreading

我有一个程序会收到一个包含路由器IP地址的列表。对于其中的每一个,将通过SSH隧道触发telnet连接。

这很好用。除了如果列表大于1000个地址(即1250)之外,将仅考虑前1000个元素。前1000个没问题,但剩下的250个甚至都不会被考虑。

首先,伪代码:

  1. 打开与服务器的ssh连接并启动ssh隧道。返回本地端口
  2. 使用本地端口
  3. 打开远程路由器的telnet连接
  4. 做点什么
  5. 关闭telnet
  6. 关闭ssh
  7. 并行连接数是一个固定的整数(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隧道的数量?

    谢谢!

0 个答案:

没有答案