Paramiko的多线程技术

3

背景

我有一个脚本连接到服务器,然后curl localhost获取所需信息。

问题

我的问题是,我需要从大约200个服务器中获取信息,使用的方法需要约15分钟才能完成,这并不糟糕,但我想要做更高级的事情,如果我可以掌握多线程,我就可以做得更多。

期望结果

我只想拥有一个5-10个工作人员的线程池,以便更快地获取所需信息。

代码

from Queue import Queue
from multiprocessing.pool import ThreadPool
import threading, os, sys
import socket
from threading import Thread
#socket.setdefaulttimeout(5)
from time import sleep
import paramiko
hosts = []
hostnames = []
def capture_travelinfo(host):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    print('Connecting to ' + host)
    ssh.connect(host, username='root', key_filename='...')
    print('Connected to ' + host)
    stdin, stdout, stderr = ssh.exec_command('curl localhost:4000')
    stdin.close()
    ssh.close()

def main():
    try:
        file = open('IPs.txt')
        threads = []
        content = file
        for x in content:
            fields = x.strip().split()
            UNIT = [fields[0], fields[1]]
            hosts.append(UNIT)
        for x in hosts:
            host = x[1]
            hostnames.append(x[1])
            ip = x[0]
            pool = ThreadPool(5)
            results = pool.map(capture_travelinfo, hostnames)
            pool.close()
            pool.join()
            print(results)

之前的尝试

我在 Stack Overflow 上搜索了一些相关的内容,但所有有用的材料都没有包括线程池,结果我最终会同时连接大约 200 个主机,这并不好。


你有什么问题? - user8680478
我完全不明白你的问题是什么。 - Sraw
@Danny Watson,IP.txt文件的内容是什么? - udit kanotra
1个回答

2
from multiprocessing.pool import ThreadPool
import paramiko
hosts = []
hostnames = []


def capture_travelinfo(host):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    print('Connecting to ' + host)
    ssh.connect(host, username='root', key_filename='...')
    print('Connected to ' + host)
    stdin, stdout, stderr = ssh.exec_command('curl localhost:4000')
    stdin.close()
    ssh.close()


def main():
    ips = open('IPs.txt')
    pool = ThreadPool(5)
    for ip in ips:
        fields = ip.strip().split()
        UNIT = [fields[0], fields[1]]
        hosts.append(UNIT)
    for ip in hosts:
        hostnames.append(ip[1])
    results = pool.map(capture_travelinfo, hostnames)
    pool.close()
    pool.join()
    print(results)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接