一 背景知识

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

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

所以想要真正了解进程,必须事先了解操作系统,点击进入    

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

必备的理论基础:

  1. #一 操作系统的作用:
  2. 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口
  3. 2:管理、调度进程,并且将多个进程对硬件的竞争变得有序
  4.  
  5. #二 多道技术:
  6. 1.产生背景:针对单核,实现并发
  7. ps
  8. 现在的主机一般是多核,那么每个核都会利用多道技术
  9. 4cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4
  10. cpu中的任意一个,具体由操作系统调度算法决定。
  11.  
  12. 2.空间上的复用:如内存中同时有多道程序
  13. 3.时间上的复用:复用一个cpu的时间片
  14. 强调:遇到io切,占用cpu时间过长也切,核心在于切之前将进程的状态保存下来,这样
  15. 才能保证下次切换回来时,能基于上次切走的位置继续运行

本文将将着重介绍进程以及它的亲戚->线程

二 python并发编程之多进程

理论:http://www.cnblogs.com/linhaifeng/articles/7430066.html

链接:http://www.cnblogs.com/linhaifeng/articles/7428874.html

三 python并发编程之多线程

理论:http://www.cnblogs.com/linhaifeng/articles/7430082.html

链接:http://www.cnblogs.com/linhaifeng/articles/7428877.html

四 python并发编程之协程

链接:http://www.cnblogs.com/linhaifeng/articles/7429894.html

五 python并发编程之IO模型

链接:http://www.cnblogs.com/linhaifeng/articles/7454717.html

六 补充:paramiko模块

1. 介绍:

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

2. 下载安装

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

在python2中

3. 使用

SSHClient

用于连接远程服务器并执行基本命令

基于用户名密码连接:

  1. import paramiko
  2.  
  3. # 创建SSH对象
  4. ssh = paramiko.SSHClient()
  5. # 允许连接不在know_hosts文件中的主机
  6. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  7. # 连接服务器
  8. ssh.connect(hostname='120.92.84.249', port=22, username='root', password='xxx')
  9.  
  10. # 执行命令
  11. stdin, stdout, stderr = ssh.exec_command('df')
  12. # 获取命令结果
  13. result = stdout.read()
  14. print(result.decode('utf-8'))
  15. # 关闭连接
  16. ssh.close()
  1. import paramiko
  2.  
  3. transport = paramiko.Transport(('120.92.84.249', 22))
  4. transport.connect(username='root', password='xxx')
  5.  
  6. ssh = paramiko.SSHClient()
  7. ssh._transport = transport
  8.  
  9. stdin, stdout, stderr = ssh.exec_command('df')
  10. res=stdout.read()
  11. print(res.decode('utf-8'))
  12.  
  13. transport.close()

SSHClient 封装 Transport

基于公钥密钥连接:

客户端文件名:id_rsa

服务端必须有文件名:authorized_keys(在用ssh-keygen时,必须制作一个authorized_keys,可以用ssh-copy-id来制作)

  1. import paramiko
  2.  
  3. private_key = paramiko.RSAKey.from_private_key_file('/tmp/id_rsa')
  4.  
  5. # 创建SSH对象
  6. ssh = paramiko.SSHClient()
  7. # 允许连接不在know_hosts文件中的主机
  8. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  9. # 连接服务器
  10. ssh.connect(hostname='120.92.84.249', port=22, username='root', pkey=private_key)
  11.  
  12. # 执行命令
  13. stdin, stdout, stderr = ssh.exec_command('df')
  14. # 获取命令结果
  15. result = stdout.read()
  16. print(result.decode('utf-8'))
  17. # 关闭连接
  18. ssh.close()
  1. import paramiko
  2.  
  3. private_key = paramiko.RSAKey.from_private_key_file('/tmp/id_rsa')
  4.  
  5. transport = paramiko.Transport(('120.92.84.249', 22))
  6. transport.connect(username='root', pkey=private_key)
  7.  
  8. ssh = paramiko.SSHClient()
  9. ssh._transport = transport
  10.  
  11. stdin, stdout, stderr = ssh.exec_command('df')
  12. result=stdout.read()
  13. print(result.decode('utf-8'))
  14.  
  15. transport.close()

SSHClient 封装 Transport

  1. import paramiko
  2. from io import StringIO
  3.  
  4. key_str = """-----BEGIN RSA PRIVATE KEY-----
  5. MIIEoQIBAAKCAQEAsJmFLrSeCumJvga0Gl5O5wVOVwMIy2MpqIyQPi5J87dg89a4
  6. Da9fczJog7qoSbRwHFOQoCHNphSlp5KPhGsF6RJewkIw9H1UKV4dCOyl/4HOAkAD
  7. rKrsEDmrJ9JlzF2GTTZSnTgVQWcvBS2RKB4eM2R9aJ11xV6X2Hk4YDLTExIWeabb
  8. h2TUKw0iyjI8pRuYLKkF2X16u9TBwfOTroGYgiNFHQvhsQppbEbI49NF2XkCkFMi
  9. 8/7tLjf95InE/VUUq56JqfzyHwdpHou+waXbwtvGgXN3sz+KkuEv6R2qDz06upZV
  10. FCZRRpDhzoR8Uh/UEzTGZb8z7FB6EJXUiXJikQIBIwKCAQBBmBuGYFf1bK+BGG7H
  11. 9ySe81ecqVsJtx4aCFLVRGScWg4RbQKIvXs5an6XU/VdNGQnx0RYvBkvDvuzRRC8
  12. J8Bd4kB0CfTtGJuaVigKoQp02HEWx1HSa17+tlWD0c4KFBvwywi+DYQ83S64x8gz
  13. eOalX9bPFenqORPUD8R7gJeKvPVc6ZTPeorpuH7u9xayP0Eop8qKxZza9Xh3foVj
  14. Qo4IxoYnDN57CIRX5PFSlDDggpmr8FtRF4nAxmFq8LhSp05ivzX/Ku1SNHdaMWZO
  15. 7va8tISXdLI5m0EGzoVoBvohIbwlxI6kfmamrh6Eas2Jnsc4CLzMsR4jBWt0LHLv
  16. /SLnAoGBANaEUf/Jptab9G/xD9W2tw/636i3gLpTPY9KPtCcAxqStNeT6RAWZ5HF
  17. lKJg+NKpu3pI45ldAwvts0i+aCZk2xakEWIZWqCmXm31JSPDQTaMGe7H0vOmUaxx
  18. ncdpBVdvhMbfFUgei15iKfuafgrKaS9oIkntXEgrC+3wBOI0Gbx3AoGBANLAGxAF
  19. TK7ydr+Q1+6/ujs6e8WsXt8HZMa/1khCVSbrf1MgACvZPSSSrDpVwaDTSjlRI4AL
  20. bb0l0RFU+/0caMiHilscuJdz9Fdd9Ux4pjROZa3TF5CFhvP7PsZAoxOo+yqJg4zr
  21. 996GG/aAv4M8lQJ2rDFk/Dgn5y/AaAun1oM3AoGAGIQmoOPYjY4qkHNSRE9lYOl4
  22. pZFQilKn8x5tlC8WTC4GCgJGhX7nQ9wQ/J1eQ/YkDfmznH+ok6YjHkGlgLsRuXHW
  23. GdcDCwuzBUCWh76LHC1EytUCKnloa3qy8jfjWnMlHgrd3FtDILrC+C7p1Vj2FAvm
  24. qVz0moiTpioPL8twp9MCgYEAin49q3EyZFYwxwdpU7/SJuvq750oZq0WVriUINsi
  25. A6IR14oOvbqkhb94fhsY12ZGt/N9uosq22H+anms6CicoQicv4fnBHDFI3hCHE9I
  26. pgeh50GTJHUA6Xk34V2s/kp5KpThazv6qCw+QubkQExh660SEdSlvoCfPKMCi1EJ
  27. TukCgYAZKY1NZ2bjJyyO/dfNvMQ+etUL/9esi+40GUGyJ7SZcazrN9z+DO0yL39g
  28. 7FT9NMIc2dsmNJQMaGBCDl0AjO1O3b/wqlrNvNBGkanxn2Htn5ajfo+LBU7yHAcV
  29. 7w4X5HLarXiE1mj0LXFKJhdvFqU53KUQJXBqR6lsMqzsdPwLMJg==
  30. -----END RSA PRIVATE KEY-----"""
  31.  
  32. private_key = paramiko.RSAKey(file_obj=StringIO(key_str))
  33. transport = paramiko.Transport(('120.92.84.249', 22))
  34. transport.connect(username='root', pkey=private_key)
  35.  
  36. ssh = paramiko.SSHClient()
  37. ssh._transport = transport
  38.  
  39. stdin, stdout, stderr = ssh.exec_command('df')
  40. result = stdout.read()
  41. print(result.decode('utf-8'))
  42. transport.close()
  43.  
  44. print(result)

基于私钥字符串进行连接

SFTPClient

用于连接远程服务器并执行上传下载

基于用户名密码上传下载

  1. import paramiko
  2.  
  3. transport = paramiko.Transport(('120.92.84.249',22))
  4. transport.connect(username='root',password='xxx')
  5.  
  6. sftp = paramiko.SFTPClient.from_transport(transport)
  7. # 将location.py 上传至服务器 /tmp/test.py
  8. sftp.put('/tmp/id_rsa', '/etc/test.rsa')
  9. # 将remove_path 下载到本地 local_path
  10. sftp.get('remove_path', 'local_path')
  11.  
  12. transport.close()

基于公钥密钥上传下载

  1. import paramiko
  2.  
  3. private_key = paramiko.RSAKey.from_private_key_file('/tmp/id_rsa')
  4.  
  5. transport = paramiko.Transport(('120.92.84.249', 22))
  6. transport.connect(username='root', pkey=private_key )
  7.  
  8. sftp = paramiko.SFTPClient.from_transport(transport)
  9. # 将location.py 上传至服务器 /tmp/test.py
  10. sftp.put('/tmp/id_rsa', '/tmp/a.txt')
  11. # 将remove_path 下载到本地 local_path
  12. sftp.get('remove_path', 'local_path')
  13.  
  14. transport.close()
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import paramiko
  4. import uuid
  5.  
  6. class Haproxy(object):
  7.  
  8. def __init__(self):
  9. self.host = '172.16.103.191'
  10. self.port = 22
  11. self.username = 'root'
  12. self.pwd = ''
  13. self.__k = None
  14.  
  15. def create_file(self):
  16. file_name = str(uuid.uuid4())
  17. with open(file_name,'w') as f:
  18. f.write('sb')
  19. return file_name
  20.  
  21. def run(self):
  22. self.connect()
  23. self.upload()
  24. self.rename()
  25. self.close()
  26.  
  27. def connect(self):
  28. transport = paramiko.Transport((self.host,self.port))
  29. transport.connect(username=self.username,password=self.pwd)
  30. self.__transport = transport
  31.  
  32. def close(self):
  33.  
  34. self.__transport.close()
  35.  
  36. def upload(self):
  37. # 连接,上传
  38. file_name = self.create_file()
  39.  
  40. sftp = paramiko.SFTPClient.from_transport(self.__transport)
  41. # 将location.py 上传至服务器 /tmp/test.py
  42. sftp.put(file_name, '/home/root/tttttttttttt.py')
  43.  
  44. def rename(self):
  45.  
  46. ssh = paramiko.SSHClient()
  47. ssh._transport = self.__transport
  48. # 执行命令
  49. stdin, stdout, stderr = ssh.exec_command('mv /home/root/tttttttttttt.py /home/root/ooooooooo.py')
  50. # 获取命令结果
  51. result = stdout.read()
  52.  
  53. ha = Haproxy()
  54. ha.run()

Demo

七 作业

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

需求:

  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并发


python之并发编程的更多相关文章

  1. Python 3 并发编程多进程之进程同步(锁)

    Python 3 并发编程多进程之进程同步(锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,竞争带来的结果就是错乱,如何控制,就是加锁处理. 1. ...

  2. Python 3 并发编程多进程之守护进程

    Python 3 并发编程多进程之守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemo ...

  3. Python 3 并发编程多进程之队列(推荐使用)

    Python 3 并发编程多进程之队列(推荐使用) 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 可以往 ...

  4. python中并发编程基础1

    并发编程基础概念 1.进程. 什么是进程? 正在运行的程序就是进程.程序只是代码. 什么是多道? 多道技术: 1.空间上的复用(内存).将内存分为几个部分,每个部分放入一个程序,这样同一时间在内存中就 ...

  5. python之并发编程初级篇8

    一.进程理论 1)进程介绍 .什么是进程 一个正在进行的过程,或者说是一个程序的运行过程 其实进程是对正在运行的程序的一种抽象/概括的说法 进程的概念起源操作系统,进程是操作最核心的概念之一 操作系统 ...

  6. Python 的并发编程

    这篇文章将讲解 Python 并发编程的基本操作.并发和并行是对孪生兄弟,概念经常混淆.并发是指能够多任务处理,并行则是是能够同时多任务处理.Erlang 之父 Joe Armstrong 有一张非常 ...

  7. Python之并发编程-多进程

    目录 一.multiprocessiong模块介绍 二.Process类的介绍 三.进一步介绍(守护进程.锁.队列.管道.事件等) 1.守护进程 2.锁(同步锁.互斥锁) 3.信号量(了解) 4.队列 ...

  8. Python的并发编程

    我们将一个正在运行的程序称为进程.每个进程都有它自己的系统状态,包含内存状态.打开文件列表.追踪指令执行情况的程序指针以及一个保存局部变量的调用栈.通常情况下,一个进程依照一个单序列控制流顺序执行,这 ...

  9. python week08 并发编程之多进程--实践部分

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...

随机推荐

  1. 初探Java设计模式2:结构型模式(代理模式,适配器模式等)

    行为型模式 行为型模式关注的是各个类之间的相互作用,将职责划分清楚,使得我们的代码更加地清晰. 策略模式 策略模式太常用了,所以把它放到最前面进行介绍.它比较简单,我就不废话,直接用代码说事吧. 下面 ...

  2. 玩转C线性表和单向链表之Linux双向链表优化

    前言: 这次介绍基本数据结构的线性表和链表,并用C语言进行编写:建议最开始学数据结构时,用C语言:像栈和队列都可以用这两种数据结构来实现. 一.线性表基本介绍 1 概念: 线性表也就是关系户中最简单的 ...

  3. Linux下编译器的安装

    一.Linux下gcc/g++/gfortran的安装 (1).gcc Linux下自带gcc编译器.可以通过“gcc -v”命令来查看是否安装. (2).g++安装g++编译器,可以通过命令“sud ...

  4. leetcode — balanced-binary-tree

    /** * Source : https://oj.leetcode.com/problems/balanced-binary-tree/ * * * Given a binary tree, det ...

  5. Shell从入门到精通进阶之二:Shell字符串处理之${}

    上一章节讲解了为什么用${}引用变量,${}还有一个重要的功能,就是文本处理,单行文本基本上可以满足你所有需求. 2.1 获取字符串长度 # VAR='hello world!' # echo $VA ...

  6. BUG心得

    在<程序员,你会从 Bug 中学习么?>一文中,我写了我是怎样追踪这些年遇到的最有趣 bug 的.最近我重新浏览了这所有的 194 个条目(历时 13 年),看看我从这些 bug 中学到了 ...

  7. Ruby Enumerator的各种迭代

    Enumerator迭代 Mix-in Enumerator获得的迭代方法: each_cons: each_slice: each_with_index: with_index: each_with ...

  8. InnoSetup 客户端程序打包教程

    之前介绍过InstallShield打包工具,本文再介绍更加方便的打包工具Inno Setup Inno Setup相对来说,比InstallShield更容易使用,不需要在VS中创建项目,只要提供D ...

  9. Android破解学习之路(十)—— 我们恋爱吧 三色绘恋 二次破解

    前言 好久没有写破解教程了(我不会告诉你我太懒了),找到一款恋爱游戏,像我这样的宅男只能玩玩恋爱游戏感觉一下恋爱的心动了.. 这款游戏免费试玩,但是后续章节得花6元钱购买,我怎么会有钱呢,而且身在吾爱 ...

  10. 看Android Stuido教程有感

    毕业两年了,之前一直都在另外的博客里写之前大学的经历,以及转载一些学习Android的点滴,原创的并不多.因为现在更多的是在博客园里逛,所以直到上个月还是鼓起勇气开通了博客,算来到今天也有一段时间了, ...