zoukankan      html  css  js  c++  java
  • python第九天

    进程

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

    进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展开的。
    PS:即使可以利用的cpu只有一个(早期的计算机确实如此),也能保证支持(伪)并发的能力。将一个单独的cpu变成多个虚拟的cpu(多道技术:时间多路复用和空间多路复用+硬件上支持隔离),没有进程的抽象,现代计算机将不复存在。
    ---为什么要有操作系统:
    现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成。
    一般而言,现代计算机系统是一个复杂的系统。
    其一:如果每位应用程序员都必须掌握该系统所有的细节,那就不可能再编写代码了(严重影响了程序员的开发效率:全部掌握这些细节可能需要一万年....)
    其二:并且管理这些部件并加以优化使用,是一件极富挑战性的工作,于是,计算安装了一层软件(系统软件),称为操作系统。它的任务就是为用户程序提供一个更好、更简单、更清晰的计算机模型,并管理刚才提到的所有设备。
    总结:程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作,这个繁琐的工作就是操作系统来干的,有了他,程序员就从这些繁琐的工作中解脱了出来,
    只需要考虑自己的应用软件的编写就可以了,应用软件直接使用操作系统提供的功能来间接使用硬件。
    ---操作系统的作用:
    1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口
    2:管理、调度进程,并且将多个进程对硬件的竞争变得有序

    多道技术:
    1.产生背景:针对单核,实现并发
    ps:
    现在的主机一般是多核,那么每个核都会利用多道技术
    有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4个
    cpu中的任意一个,具体由操作系统调度算法决定。

    2.空间上的复用:如内存中同时有多道程序
    3.时间上的复用:复用一个cpu的时间片
    强调:遇到io切,占用cpu时间过长也切,核心在于切之前将进程的状态保存下来,这样
    才能保证下次切换回来时,能基于上次切走的位置继续运行


    一 什么是进程
    二 进程与程序的区别
    三 并发与并行
    四 同步\异步and阻塞\非阻塞
    五 进程的创建、终止
    六 进程的状态
    七 进程并发的实现


    paramiko模块
    ------------------------------------------------------------------------------------------------

    --paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实。
    ---#在python3中
    pip3 install paramiko
    ---#在python2中
    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
    ------------------------------------------------------------------------------------------------
    SSHClient
    ---用于连接远程服务器并执行基本命令
    import paramiko

    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器
    ssh.connect(hostname='120.92.84.249', port=22, username='root', password='xxx')

    # 执行命令
    stdin, stdout, stderr = ssh.exec_command('df')
    # 获取命令结果
    result = stdout.read()
    print(result.decode('utf-8'))
    # 关闭连接
    ssh.close()
    ---封装 Transport
    import paramiko
    transport = paramiko.Transport(('120.92.84.249', 22))
    transport.connect(username='root', password='xxx')
    ssh = paramiko.SSHClient()
    ssh._transport = transport
    stdin, stdout, stderr = ssh.exec_command('df')
    res=stdout.read()
    print(res.decode('utf-8'))
    transport.close()
    SFTPClient
    import paramiko
    transport = paramiko.Transport(('120.92.84.249',22))
    transport.connect(username='root',password='xxx')
    sftp = paramiko.SFTPClient.from_transport(transport)
    # 将location.py 上传至服务器 /tmp/test.py
    sftp.put('/tmp/id_rsa', '/etc/test.rsa')
    # 将remove_path 下载到本地 local_path
    sftp.get('remove_path', 'local_path')
    transport.close()

    ----------------------------------Demo--------------------------------------------------------------
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import paramiko
    import uuid

    class Haproxy(object):

    def __init__(self):
    self.host = '172.16.103.191'
    self.port = 22
    self.username = 'root'
    self.pwd = '123'
    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)
    # 将location.py 上传至服务器 /tmp/test.py
    sftp.put(file_name, '/home/root/tttttttttttt.py')

    def rename(self):

    ssh = paramiko.SSHClient()
    ssh._transport = self.__transport
    # 执行命令
    stdin, stdout, stderr = ssh.exec_command('mv /home/root/tttttttttttt.py /home/root/ooooooooo.py')
    # 获取命令结果
    result = stdout.read()


    ha = Haproxy()
    ha.run()
    ------------------------------------------------------------------------------------------------


    argparse模块

    ------------------------------------------------------------------------------------------------
    1. 创建一个解析器
    2. 添加参数
    3. 解析参数
    ------------------------------------------------------------------------------------------------
    import argparse
    parser = argparse.ArgumentParser(description='Search some files')

    parser.add_argument('-n','--name', help='username')
    parser.add_argument('-p','--pass', help='password ')
    parser.add_argument('-host','--hostname', help='hostname ', nargs='*')

    args = parser.parse_args()

    print(args.name)
    print(args.pass)
    print(args.hostname)
    ------------------------------------------------------------------------------------------------
    ---ArgumentParser 对象
    class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter,prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True)
    创建一个新的argmentParserr对象。所有的参数应该以关键字参数传递。下面有对每个参数各自详细的描述,但是简短地讲它们是:
    prog - 程序的名字(默认:sys.argv[0])
    useage - 描述程序用法的字符串(默认:从解析器的参数生成)
    description - 参数帮助信息之前的文本(默认:空)
    epilog- 参数帮助信息之后的文本(默认:空)
    parents - ArgmentParser 对象的一个列表,这些对象的参数应该包括进去
    ormatter_class - 定制化帮助信息的类
    prefix_chars - 可选参数的前缀字符集(默认:‘-‘)
    fromfile_prefix_chars - 额外的参数应该读取的文件的前缀字符集(默认:None)
    argument_default - 参数的全局默认值(默认:None)
    conflict_handler - 解决冲突的可选参数的策略(通常没有必要)
    add_help - 给解析器添加-h/–help 选项(默认:True)

    add_argument() 方法
    ArgumentParser.add_argument(nameor flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][,metavar][, dest])
    定义应该如何解析一个命令行参数。下面每个参数有它们自己详细的描述,简单地讲它们是:
    name or flags- 选项字符串的名字或者列表,例如foo 或者-f, --foo。
    action - 在命令行遇到该参数时采取的基本动作类型。
    nargs - 应该读取的命令行参数数目。
    const- 某些action和nargs选项要求的常数值。
    default - 如果命令行中没有出现该参数时的默认值。
    type- 命令行参数应该被转换成的类型。
    choices - 参数可允许的值的一个容器。
    required - 该命令行选项是否可以省略(只针对可选参数)。
    help - 参数的简短描述。
    metavar - 参数在帮助信息中的名字。
    dest - 给parse_args()返回的对象要添加的属性名称。

  • 相关阅读:
    winform笔记
    深度GHOST安装,GHOST完毕后不能启动继续
    CSS+JS;JS+CSS换肤总结
    windows2008配置来
    ul li做标题列表中间出现多的一个空行,重复。
    洛谷P3376 【模板】网络最大流
    洛谷P3387 【模板】缩点
    洛谷P3796 【模板】AC自动机(加强版)
    洛谷P3384 【模板】树链剖分
    洛谷P3919 【模板】可持久化数组(可持久化线段树/平衡树)
  • 原文地址:https://www.cnblogs.com/wdee/p/7854069.html
Copyright © 2011-2022 走看看