Python基础-week08 并发编程

一 背景知识

  顾名思义,进程即正在执行的一个过程。进程是对正在运行程序的一个抽象。

  进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展开的。

  所以想要真正了解进程,必须事先了解操作系统:http://www.cnblogs.com/linhaifeng/p/6295875.html

 

  PS:即使可以利用的cpu只有一个(早期的计算机确实如此),也能保证支持(伪)并发的能力。将一个单独的cpu变成多个虚拟的cpu(多道技术:时间多路复用和空间多路复用+硬件上支持隔离),没有进程的抽象,现代计算机将不复存在。

 

  必备的理论基础:

   *1.操作系统的作用:
        1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口。
        2:管理、调度进程,并且将多个进程对硬件的竞争变得有序。

  *2.多道技术:
        1.产生背景:针对单核,实现并发
          ps:
          现在的主机一般是多核,那么每个核都会利用多道技术。
          有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4个。
          cpu中的任意一个,具体由操作系统调度算法决定。
    
        2.空间上的复用:如内存中同时有多道程序。


        3.时间上的复用:复用一个cpu的时间片。
           强调:遇到io切,占用cpu时间过长也切,核心在于切之前将进程的状态保存下来,这样才能保证下次切换回来时,能基于上次切走的位置继续运行。


二 python并发编程之多进程

  1.理论部分:https://www.cnblogs.com/Jame-mei/p/9578421.html

  2.实践部分:https://www.cnblogs.com/Jame-mei/p/9578512.html

  

三 python并发编程之多线程

  1.理论部分:https://www.cnblogs.com/Jame-mei/p/9627942.html

  2.实践部分:https://www.cnblogs.com/Jame-mei/p/9627949.html


四 python并发编程之协程

   协程相关内容:https://www.cnblogs.com/Jame-mei/p/9698633.html


五 python并发编程之IO模型

  待更新...


六 补充:paramiko模块

  1.介绍

    paramiko时一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或者文件操作,值得一说的是,fabric和ansible 内部的远程管理都是使用paramiko来实现的。

 

  2.下载安装

    pi3 install paramiko #在python3.x中    

pycrypto,由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto #在python2中
pip3 install pycrypto
pip3 install paramiko
注:如果在安装pycrypto2.0.1时发生如下错误
        command 'gcc' failed with exit status 1...
可能是缺少python-dev安装包导致
如果gcc没有安装,请事先安装gcc
在python2中

 

  3.使用SSHClient  和  SFTPClient

    1):SSHClient

    

# @Time    : 2018/9/14 10:05
# @Author  : Jame
import paramiko

#1.创建ssh对象
ssh=paramiko.SSHClient()

#2.运行连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)

#3.连接服务器
ssh.connect(hostname='10.0.0.1',port=22,username='test',password='123')

#4.执行命令,收取执行的结果
stdin,stdout,stderr=ssh.exec_command('df -h')

#5.获取命令
result=stdout.read()
print(result.decode('utf-8'))

#6关闭连接
ssh.close()
SSHClient基于用户密码连接1
# @Time    : 2018/9/14 10:13
# @Author  : Jame
import paramiko

#1.创建transport对象
transport=paramiko.Transport(('10.0.0.1',22))

#2.连接服务器操作
transport.connect(username='test',password='123')


#3.用sshclient创建ssh对象
ssh=paramiko.SSHClient()
ssh._transport=transport

#4.用sshclient的对象运行命令
stdin,stdout,stderr=ssh.exec_command('data')

#5.收取命令结果
res1=stdout.read()
res2=stderr.read()

#6.打印
res=res1+res2
print(res.decode('utf-8'))


#7.关闭transport对象
transport.close()
SSHClient基于封装Transport密码连接2

 

# @Time    : 2018/9/14 10:05
# @Author  : Jame
import paramiko

#1.创建ssh对象
ssh=paramiko.SSHClient()

#2.运行连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)

#3.连接服务器
ssh.connect(hostname='54.223.43.144',port=22,username='jame',password='Tk1d^2(W+21')

#4.执行命令,收取执行的结果
stdin,stdout,stderr=ssh.exec_command('df -h')

#5.获取命令
result=stdout.read()
print(result.decode('utf-8'))

#6关闭连接
ssh.
# @Time    : 2018/9/14 10:13
# @Author  : Jame
import paramiko

#1.创建transport对象
transport=paramiko.Transport(('54.223.43.144',22))

#2.连接服务器操作
transport.connect(username='jame',password='Tk1d^2(W+21')


#3.用sshclient创建ssh对象
ssh=paramiko.SSHClient()
ssh._transport=transport

#4.用sshclient的对象运行命令
stdin,stdout,stderr=ssh.exec_command('data')

#5.收取命令结果
res1=stdout.read()
res2=stderr.read()

#6.打印
res=res1+res2
print(res.decode('utf-8'))


#7.关闭tr
# @Time    : 2018/9/14 10:34
# @Author  : Jame
import paramiko

#1.设置私钥地址
private_key=paramiko.RSAKey.from_private_key_file(r'D:\gitclient\Huge-psiot-test.pem')

#2.创建ssh 对象
ssh=paramiko.SSHClient()

#3.允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)

#4.连接服务器
ssh.connect(hostname='54.223.68.72',port=22,username='ec2-user',pkey=private_key)

#5.执行命令
msg=input('请输入执行命令:').strip()
stdin,stdout,stderr=ssh.exec_command(msg)

#6.获取命令结果
res1=stderr.read()
res2=stdout.read()
res=res1+res2
print(res.decode('utf-8'))


#7.关闭连接
ssh.close()
SSHClient基于密钥连接3
# @Time    : 2018/9/14 13:11
# @Author  : Jame
import paramiko

#1.设置私钥地址
private_key=paramiko.RSAKey.from_private_key_file(r'D:\gitclient\Huge-psiot-test.pem')

#2.连接获取transport对象
transport=paramiko.Transport(('54.223.68.72',22))
transport.connect(username='ec2-user',pkey=private_key)


#3.获取ssh对象
ssh=paramiko.SSHClient()
ssh._transport=transport

#4.发送指令,收取命令
stdin,stdout,stderr=ssh.exec_command('df')
result=stdout.read()
print(result.decode('utf-8'))

transport.close()
SSHClient基于封装Transport密钥连接4

 

  2):SFTPClient  

# @Time    : 2018/9/14 13:22
# @Author  : Jame
import paramiko

transport=paramiko.Transport(('10.0.0.1',22))
transport.connect(username='test',password='123')


sftp=paramiko.SFTPClient.from_transport(transport)


#上传,将本地E:\pythonwork ...testparakio.txt 上传到/tmp下
sftp.put(r'E:\pythonwork\s14\day11\paramiko模块练习\testparamiko.txt','/tmp/paramikotest.txt')


#下载,将/tmp下的server.txt 下载到本地E:python....
sftp.get('/tmp/server.txt',r'E:\pythonwork\s14\day11\paramiko模块练习\server.txt')


transport.close()
SFTPClient基于用户名密码的上传下载1
# @Time    : 2018/9/14 13:22
# @Author  : Jame
import paramiko

#设置密钥地址
private_key=paramiko.RSAKey.from_private_key_file(r'D:\gitclient\Huge-psiot-test.pem')

transport=paramiko.Transport(('10.0.0.1',22))
transport.connect(username='ec2-user',pkey=private_key)


sftp=paramiko.SFTPClient.from_transport(transport)


#上传,将本地E:\pythonwork ...testparakio.txt 上传到/tmp下
sftp.put(r'E:\pythonwork\s14\day11\paramiko模块练习\testparamiko.txt','/tmp/paramikotest.txt')


#下载,将/tmp下的server.txt 下载到本地E:python....
sftp.get('/home/ec2-user/php-5.6.36.tar.gz',r'E:\pythonwork\s14\day11\paramiko模块练习\php-5.6.tar.gz')


transport.close()
SFTPClient基于密钥的上传下载2

 

 1 # @Time    : 2018/9/14 15:12
 2 # @Author  : Jame
 3 import paramiko
 4 import uuid
 5 
 6 class Haproxy(object):
 7 
 8     def __init__(self):
 9         self.host='10.0.0.1'
10         self.port=22
11         self.username='jame'
12         self.pwd='AiMeiNv'
13         self.__k=None
14 
15 
16     def create_file(self):
17         file_name=str(uuid.uuid4())
18         with open(file_name,'w') as f:
19             f.write('sb')
20 
21         return file_name
22 
23 
24     def run(self):
25         self.connect()
26         self.upload()
27         self.rename()
28         self.close()
29 
30     def connect(self):
31         transport=paramiko.Transport((self.host,self.port))
32         transport.connect(username=self.username,password=self.pwd)
33         self.__transport=transport
34 
35 
36     def close(self):
37         self.__transport.close()
38 
39 
40     def upload(self):
41         #连接,上传
42         file_name=self.create_file()
43         sftp=paramiko.SFTPClient.from_transport(self.__transport)
44         sftp.put(file_name,'/tmp/tt.py')
45 
46 
47     def rename(self):
48         ssh=paramiko.SSHClient()
49         ssh.__transport=self.__transport
50         stdin,stdout,stderr=ssh.exec_command('mv /tmp/tt.py  /tmp/rename.py')
51         #result=stdout.read()
52         #print(result.decode('utf-8'))
53 
54 
55 
56 ha=Haproxy()
57 ha.run()
SFTPClient用面向对象上传下载3

 

 


七 练习 

  题目:简单主机批量管理工具

  需求:

  1. 主机分组
  2. 主机信息配置文件用configparser解析
  3. 可批量执行命令、发送文件,结果实时返回,执行格式如下 
    1. batch_run  -h h1,h2,h3   -g web_clusters,db_servers    -cmd  "df -h" 
    2. batch_scp   -h h1,h2,h3   -g web_clusters,db_servers  -action put  -local test.py  -remote /tmp/ 
  4. 主机用户名密码、端口可以不同
  5. 执行远程命令使用paramiko模块
  6. 批量命令需使用multiprocessing并发

  代码地址:https://gitee.com/meijinmeng/Simple_host_system.git

posted @ 2018-09-03 15:00  meijinmeng  阅读(243)  评论(0编辑  收藏  举报