Python基础-week08 并发编程

一 背景知识

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

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

  因此想要真正了解进程,必须事先了解操做系统:http://www.cnblogs.com/linhaifeng/p/6295875.html
python

 

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

 

  必备的理论基础:web

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

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


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


二 python并发编程之多进程

  1.理论部分:http://www.javashuo.com/article/p-gydliqpd-r.htmlpython3.x

  2.实践部分:http://www.javashuo.com/article/p-ppoolbjl-d.html服务器

  

三 python并发编程之多线程

  1.理论部分:http://www.javashuo.com/article/p-qtmswgdx-r.html多线程

  2.实践部分:http://www.javashuo.com/article/p-vjvhxxle-w.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

相关文章
相关标签/搜索