python之路--paramiko实现简单主机管理

线程池

首先怎么理解线程池呢?
比如有十台机器(线程池的大小),现在要加工一百件产品(要执行的任务)。
一件产品加工完之后(任务完成)机器(线程)开始加工下一件产品(添加任务到线程池)。
因为不能有100件产品需要加工就买100台机器。也不能因为到最后要加工不到十件产品让十台机器都开着。
那么就应该让机器如果发现没有产品需要加工的时候就停止运行。

将产品按照顺序排列。十台机器开始加工,机器性能可能不一样,产品也可能存在不一样,所以加工的时间也不一致。
有的机器可能快一点。只要一台机器加工完了当前产品,那么就从剩下的产品队列中取产品。直到发现再没有产品可取了。
那么就停止当前机器。

有了上面的解释线程池就好理解多了,有一堆任务需要开辟线程去执行,但是不能一下开辟那么多线程,需要有个限额,所以线程池就来了。利用队列,将需要执行的任务放到队列里面,然后再调用线程池从队列里面取任务执行。

怎么去在队列执行完去关闭线程呢。
这里需要用到上下文管理

@contextlib.contextmanager
def _workerState(self, stateList, workerThread):
stateList.append(workerThread)
try:
yield
finally:
stateList.remove(workerThread)

下面调用self._workState的时候,用with进行管理。这样再执行前会加入队列,执行后悔移除队列。

paramiko是第三方模块,比较强大,可以帮助我们很轻易的创建ssh连接。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# created by hansz
import select
import paramiko
import tty
import sys
user= "hansz"
passwd= "hansz"
# host_list =["192.168.17.137"]
port = 22
host = "192.168.17.137"
# 用的是不同的类。
# 第一种方式 直接创建SSHClient(),其实也是封装了Transsport,只能用于执行命令
# ssh = paramiko.SSHClient()# 短暂连接,执行完就断
# ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# ssh.connect(host, port, user, passwd)

# 第二种,Transport,执行命令用这种,上传下载文件也可以用这种。
transport = paramiko.Transport((host,22))
# transport.connect(username=user,password=passwd)

# 或者
transport.start_client()
transport.auth_password(user,passwd)

# 要执行命令的话可以给ssh._transport赋值。
# ssh = paramiko.SSHClient()
# ssh._transport = transport
# stdin,stdout,stderr = ssh.exec_command("ls")
# print stdout.read()

# 上传下载文件
# sftp = paramiko.SFTPClient.from_transport(transport)
# sftp.put("haha","aa")

# always connet
channel = transport.open_session()
channel.get_pty()
channel.invoke_shell()

import termios
import tty
oldtty = termios.tcgetattr(sys.stdin)
try:
    tty.setraw(sys.stdin.fileno())
    channel.settimeout(0.0)
    while True:
        readable, writeable, error = select.select([channel, sys.stdin, ],[],[],1)

        # if it change ,select will catch this
        if channel in readable:
            try:
                x = channel.recv(1024)
                if len(x) == 0:
                    print "EOF"
                    break
                sys.stdout.write(x)
                sys.stdout.flush()
            except socket.timeout:
                pass
        if sys.stdin in readable:
            # read should be 1
            x = sys.stdin.read(1)
            if len(x) == 0:
                break
            channel.send(x)
finally:
    termios.tcsetattr(sys.stdin,termios.TCSADRAIN,oldtty)

transport.close()

你可能感兴趣的:(python之路--paramiko实现简单主机管理)