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
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()
# @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()
# @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()
# @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()
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()
# @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()
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()
七 练习
题目:简单主机批量管理工具
需求:
- 主机分组
- 主机信息配置文件用configparser解析
- 可批量执行命令、发送文件,结果实时返回,执行格式如下
- batch_run -h h1,h2,h3 -g web_clusters,db_servers -cmd "df -h"
- batch_scp -h h1,h2,h3 -g web_clusters,db_servers -action put -local test.py -remote /tmp/
- 主机用户名密码、端口可以不同
- 执行远程命令使用paramiko模块
- 批量命令需使用multiprocessing并发
代码地址:https://gitee.com/meijinmeng/Simple_host_system.git