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

相關文章
相關標籤/搜索