zoukankan      html  css  js  c++  java
  • python学习笔记——玖

    模块

    improt paramiko

    Linux连接客户端

    import paramiko

      

    ssh = paramiko.SSHClient()

    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    ssh.connect("某IP地址",22,"用户名", "口令")

    stdin, stdout, stderr = ssh.exec_command("你的命令")

    print stdout.readlines()

    ssh.close()

    Linux下载 上传文件

     

    如果报错,取消注释

    通过 代码ssh 通过公钥 连接linux客户端

    多线程

     

    类的方式启动线程

     同时创键50个线程

    参数不一样就代表是不同的线程

     

    线程等待 join()

    下图 代表t1执行完 后再执行下边的代码

    统计所有线程都执行完所用的时间

    创建一个列表 把所有的线程引用都加进列表

    然后循环列表 执行join

     

    打印当前线程

    主线程打印如下

    子线程的打印如下

    查看当前活动的线程

    如下输出 51

    守护线程,服务于主线程。主线程执行完毕,守护线程立刻退出,不管是否执行完毕。

    但守护线程先执行完毕,就不会等待主线程。

     

    下图 setDaemon(True) 设置线程为守护线程

    注意:设置要写在 start()前边

    python解释器

     

    cpython 解释器

    python在同一时间只会有一个线程在执行

    例如 变量num 如果4个线程同时加1,可能造成结果混乱。所以有个全局解释器锁(gil)。保证了同一时间只有一个线程在执行。

     

    pypy解释器(python的未来)

    去掉了全局解释器锁,并且加入了即时编译功能,就是提前预编译一部分代码。所以速度很快

     

    线程锁(互斥锁)

    虽然有 全局解释器锁(git),但是多线程并发执行 因为线程的内存是共享的 所

    对一个变量修改的时候依然会造成数据混乱。

    保护一段代码,每次只能被一个线程运行。

     

    lock=threading.Lock 创建锁对象

    lock.acquire  得到锁

    lock.release()释放锁

     

    递归锁

    当有多个锁嵌套时。会导致锁混乱,造成死循环。这时用到递归锁 RLock

    可解决此类问题。

    全局解释锁(GIL)

    同一时间只会有一个线程在执行

    giL并不是python的特性,而是python解释器,CPython引入的一个概念。因为

    CPython是python的默认解释器,所以在很多人的概念里CPython就是python,

    GIL归结为python的缺陷。但其实 jpython 和 pypy都没有GIL的概念。

    计算任务 包含计算密集型和Io密集型

    计算密集型的特点是进行大量的计算,复杂的加减乘除,视频解码,全靠cpu的运算能力。所以代码的运算效率非常重要,python这样的脚本语言运行效率比较低,不太适合计算密集型任务,最好是用c语言写。

    IO密集型 的特点是 磁盘IO,网络IO占主要的任务。对CPU的消耗很少。这于这种任务,开发效率的语言就非常适合。比如Python,c语言就表现的差一些。

    GIL只会影响到那些严重依赖CPU的程序,比如计算密集型的。

    信号量

    保护一段代码 允许有限数目的线程,去执行一段代码。

    例如线程池。例如你的程序,被几个人访问。

    线程锁和信号量,都是为了保护一段代码。

    区别是: 数据锁只允许一个线程执行,信号量可以指定多个线程。

     

    Events 事件 4个方法

    event.set() #设置标志位

    event.clear()#清空标志位

    event.is_set() #判断标志位是否被设置

    event.wait()#阻塞状态

    红绿灯

    车的代码 以及启动线程

    队列

    python自带的队列

    容器

    利于多线程处理任务,完成程序的解耦 生产者和消费者只和队列有关系

     

     

    列表和队列的区别

    列表取出数据 数据还在列表中

    队列取出数据 数据只有一份,取走就没有了

     

     

    先入先出 常用

    q=queue.Queue(参数可选)

         maxsize=3  设置队列的容量  默认无限容量

     

    后入先出     

    q=queue.LifoQueue(参数同上 )

     

    可设置优先级的队列

    q=queue.PriorityQueue(参数同上)

      添加数据时,是个元组。数值小的会被先取到

    put(数据) 添加数据

    get(可选参数)  获取数据 取不到数据

         block=True  默认是True会阻塞 改成false不会阻塞

    timeout=1   可设置阻塞时间

    get_nowait() 获取数据 取不到数据,会报错

    qsize() 获得队列的数据量

     

     

     

  • 相关阅读:
    希尔排序
    折半插入排序
    自学git心得-2
    读书笔记-1 《人月神话》
    USTCCourseCommunity 项目介绍
    自学git心得-1
    HDU 2006 求奇数的乘积
    HDU 2007 平方和与立方和
    HDU 2005 第几天?
    HDU 2004 成绩转换
  • 原文地址:https://www.cnblogs.com/HL-blog/p/7622261.html
Copyright © 2011-2022 走看看