zoukankan      html  css  js  c++  java
  • Python3.5 学习九

    进程与线程

    线程(Thread)是计算机运算调度的最小单位,它存在于进程中,是实际运作单位。每个进程都可能并发多线程。

      每一个程序的内存是独立的。

      线程:是操作系统最小的运算调度单位,是一串指令的集合。

      所有在同一进程里的线程是共享同一块内存空间,而多线程抢同一资源时会出现问题。

      第一个创建的线程为主线程,但主线程和子线程之间没有任何隶属关系的,这与主进程子进程不一样

    进程:一个程序执行的实例(应用程序)就被称为一个进程。要以一个整体形势暴露给操作系统来管理,里面包含对各种资源的调用,内存的对各种资源管理的结合,就可以成为进程。

    进程和线程的区别:

      1.  线程共享内存空间,进程的内存是独立的

      2.  子线程共享内存空间,多子进程的资源都是相同的COPY,是独立而不是共享的。

      3.  同一进程长得线程之间可以直接交流,两个进程之间如果要通信,必须通过一个中间代理来实现

      4.  创建新线程很简单,创建新进程需要对其父进程进行一次克隆

      5.  一个线程可以控制和操作同一进程里的其他线程,但进程只能操作子进程

      6.  对主线程的修改有可能会影响其他线程的运行,但对父进程的修改,不会影响其他子进程的运行

      7.  主线程关闭,不会影响其他子线程运行,主进程关闭,子进程也会结束。

      线程类继承threading.Thread

      等待线程结束:t.join()

      将子线程设置为守护线程:t.setDaemon(True)

      主线程退出,子线程便都退出了

    全局解释器锁gil:多核的机器,可以真正同时并发

           但是在C-Python中,实际只是一核在运算,调用操作系统的原生线程,只有同一时间可以拿到数据,实际以单核执行

      Python将来使用pyty技术,会速度非常快。去掉全局解释器锁,加入了Justruntime,即时编译,边编译边执行,提前预编译一部分。

    如果程序间需要锁套锁,需要使用递归锁的概念,Rlock

      

     信号量:相当于房间的门,有多个,每个有一个锁,出来一个可以再进去一个

      event=threading.event()

      事件的方法:

      set()

      is_set()

      clear()

      wait()

      红绿灯实例:

      

    # Author:huhu
    import threading
    import time

    event = threading.Event()
    def lighter():
    count=0
    event.set()
    while True:
    if count>=5 and count<10:#改成红灯
    event.clear() #把标志位清空了
    print("33[41;1mred light is on...33[0m")
    elif count>10:
    event.set()
    count=0
    else:
    print("33[42;1mgreen light is on...33[0m")
    time.sleep(1)
    count+=1

    def car(name):
    while True:
    if event.is_set():
    print("[%s] is running..."%name)
    time.sleep(1)
    else:
    print("[%s] sees red light...waiting..."% name)
    event.wait()
    print("33[34;1m[%s] green light is on,start running.33[0m"% name)

    light = threading.Thread(target=lighter,)
    light.start()

    car1 = threading.Thread(target=car,args=("Tesla",))
    car1.start()

    重点知识之queue队列:

    可理解为一个存放数据的容器,
    class queue.Queue(maxsize=0)      #先入先出
    class queue.LifoQueue(maxsize=0)    #后入先出
    class queue.PriorityQueue(maxsize=0)  #存储数据时可设置优先级的队列

     重要的作用:

    1  完成对程序解耦

    2  提高运行效率 

      利用多线程和队列做一个生产者消费者多并发模型实例:详见20180810

    本周作业:

    开3个不同,主机用户名不同

    简单主机批量管理:

    主机列表

    1 exec cmd

    2 send file

    每个操作是每台主机都做相同的操作

      

      

       

      

  • 相关阅读:
    软件工程作业------分析文本文档,统计出现频率最多的十个单词
    关于IBOutlet的生命周期
    重装iTunes 错误代码42401 解决办法
    关于在多个UItextield切换焦点
    关于如何使用代码触发 UIButton的Unwind Segue
    NSFileManager在初始化文件的时候一不留神就进入陷阱
    Xcode的编辑利器Xvim,如何去掉烦人工具栏和文件路径
    __weak 和 __strong 还有Autorelease的用法
    关于NSFetchedResultsController的一些用法
    关于MVC模型的NSNotification用法
  • 原文地址:https://www.cnblogs.com/HU-HU/p/9447720.html
Copyright © 2011-2022 走看看