一 背景知识

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

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

  所以想要真正了解进程,必须事先了解操作系统: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='') #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='') #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='') 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

 # @Time    : 2018/9/14 15:12
# @Author : Jame
import paramiko
import uuid class Haproxy(object): def __init__(self):
self.host='10.0.0.1'
self.port=22
self.username='jame'
self.pwd='AiMeiNv'
self.__k=None def create_file(self):
file_name=str(uuid.uuid4())
with open(file_name,'w') as f:
f.write('sb') return file_name def run(self):
self.connect()
self.upload()
self.rename()
self.close() def connect(self):
transport=paramiko.Transport((self.host,self.port))
transport.connect(username=self.username,password=self.pwd)
self.__transport=transport def close(self):
self.__transport.close() def upload(self):
#连接,上传
file_name=self.create_file()
sftp=paramiko.SFTPClient.from_transport(self.__transport)
sftp.put(file_name,'/tmp/tt.py') def rename(self):
ssh=paramiko.SSHClient()
ssh.__transport=self.__transport
stdin,stdout,stderr=ssh.exec_command('mv /tmp/tt.py /tmp/rename.py')
#result=stdout.read()
#print(result.decode('utf-8')) ha=Haproxy()
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

Python基础-week08 并发编程的更多相关文章

  1. 周末班:Python基础之并发编程

    进程 相关概念 进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本 ...

  2. python基础之socket编程 (转自林海峰老师)

    python基础之socket编程   阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 ...

  3. Python 基础之socket编程(三)

    python 基础之socket编程(三) 前面实现的基于socket通信只能实现什么呢?在tcp协议的通信中就是一个用户说一句,服务端给你回一句,你再给服务端说一句,服务端再给你回一句,就这样一直友 ...

  4. Python基础:函数式编程

    一.概述 Python是一门多范式的编程语言,它同时支持过程式.面向对象和函数式的编程范式.因此,在Python中提供了很多符合 函数式编程 风格的特性和工具. 以下是对 Python中的函数式编程 ...

  5. Python中的并发编程

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

  6. Python 基础之socket编程(二)

    Python 基础之socket编程(二) 昨天只是对socket编程做了简单的介绍,只是把socket通信的框架搭建起来,要对其中的功能进行进一步的扩充,就来看看今天的料哈! 一.基于tcp的套接字 ...

  7. Python 基础之socket编程(一)

    Python 基础之socket编程(一) 可以进行通信玩儿了,感觉不错不错,网络通信就像打电话,我说一句你听一句之后,你再说一句,我听一句,就这样.....下去了.不扯淡了,来来来,看看今天都搞了点 ...

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

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

  9. python week08 并发编程之多线程--理论部分

    一. 什么是线程 1.定义 线程就像一条工厂车间里的流水线,一个车间里可以用很多流水线,来执行生产每个零部件的任务. 所以车间可以看作是进程,流水线可以看作是线程.(进程是资源单位,线程是执行单位) ...

随机推荐

  1. jmeter之吞吐量、吞吐率、TPS、带宽及压力测试和负载测试及其区别

    一般使用单位时间内服务器处理的请求数来描述其并发处理能力.称之为吞吐率(Throughput),单位是 “req/s”.吞吐率特指Web服务器单位时间内处理的请求数另一种描述,吞吐率是,单位时间内网络 ...

  2. 实战:ADFS3.0单点登录系列-前置准备

    本文为本系列第二篇,主要分为两部分进行介绍, 一.网络拓扑 二.证书制作 还是将本系列目录贴出来,方便导航 实战:ADFS3.0单点登录系列-总览 实战:ADFS3.0单点登录系列-前置准备 实战:A ...

  3. thinkphp 3.2.3版本学习笔记

    2.开启调试模式,有什么作用?(默认关闭,在ThinkPHP.php 33行左右) (1)非法调用的时候,有详细的报错信息,便于调试 (2)APP_DEBUG为true并且缓存文件存在,走缓存文件,否 ...

  4. hiho一下 第三十七周 二分查找之k小数

    题目链接:http://hihocoder.com/contest/hiho37/problem/1 , 简单二分. 算法: 题目即为求一个无序数组数组中第k小的数,由于数据量太大,排序是会超时的. ...

  5. [转载]AngularJS入门教程04:双向绑定

    在这一步你会增加一个让用户控制手机列表显示顺序的特性.动态排序可以这样实现,添加一个新的模型属性,把它和迭代器集成起来,然后让数据绑定完成剩下的事情. 请重置工作目录: git checkout -f ...

  6. numpy各函数简介之生成数组函数

    1.empty(shape[, dtype, order]) 依据给定形状和类型(shape[, dtype, order])返回一个新的空数组. 参数: shape : 整数或者整型元组 定义返回数 ...

  7. js表单序列化时,非空判断

    在项目中,对于数据的传输一般需要非空的判断,而数据字段较多时一般直接将表单序列化,此时如何判断非空,如下 因为将表单序列化时,数据格式为 trainKind=1&trainKindCode=1 ...

  8. Oracle 配置文件目录

    Oracle 配置文件目录 ① 在oracle安装目录下,找D:\oracle\product\10.2.0\client_1\NETWORK\ADMIN中的tnsnames.ora文件,找到之后,配 ...

  9. ES6 Reflect使用笔记

    Reflect Reflect 对象和Proxy对象一样, 为操作对象提供了新的API. 为什么使用 Reflect的方式来操作对象? 将 Object 对象上一些明显属于内部的方法放到 Reflec ...

  10. 四、Shell 数组

    Shell 数组 数组中可以存放多个值.Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似). 与大部分编程语言类似,数组元素的下标由0开始. She ...