zoukankan      html  css  js  c++  java
  • Python--10、线程

    线程

    每个进程里都有一个控制线程,进程不是一个执行单位,线程是执行单位,进程是资源单位(资源隔离)。
    进程下可以开多个线程,多线程共享进程内的资源。
    创建线程的速度比创建进程的速度快,因为创建线程不需要再申请内存空间申请资源等。进程间完全独立,一个进程内的线程资源共享。
    #进程之间是竞争关系,线程之间更多的是协作关系。

    多线程

    进程内除了控制线程,还有别的线程即为多进程。
    多线程共享一个进程的地址空间。

    开启多线程的两种方式:

    • threading模块的Thread方法。
      t=Tread(target=module,args=...) t.start()
      t.join()
    • 自己定义一个类,继承Thread方法。
      自己继承重新封装一下init方法。

    #多个线程的PID是一样的。内存空间是共享的。
    为了防止资源竞争抢占,也需要加互斥锁
    使用方式与进程使用一样。

    GIL

    cpython所独有的。全局解释器锁,互斥锁。

    启动时,会先加载解释器的C代码,再加载执行python文件的代码,把执行文件代码当做参数传给C代码,由C代码来执行。
    每启动一个进程,除了主线程,解释器还会启动一个垃圾回收线程。
    弃用的数据,被垃圾回收线程和用户线程同时要支配这个数据。会矛盾,所以需要锁住解释器的代码。
    python的线程不会有并行的情况。

    #python利用多核要依靠多进程 。

    守护线程

    和守护进程的区别:
    进程内多个线程时,主线程结束条件是非主线程+守护线程之外的线程都结束后主线程才算结束。

    死锁与递归锁

    死锁:1拿到了A锁,要拿B锁,2拿着B锁要拿A锁,于是就死锁了。

    递归锁:每次被acquire计数就+1

    ,release一次计数器就减1,为0是其他线程才能强。
    用一个计数的方式,实现可以不断acquire,知道计数器被release释放为0其他线程才能去强。

    信号量

    threading模块的semaphore方法。
    sm = semaphore(5)
    with sm:
    #或者acquire release调用
    在有N多个线程时,控制同一时间有多少线程在运行。与线程池不同。

    线程池

    threadpoolexcept方法,用法与进程池一样,默认的最大线程池是CPU核数的5倍。
    其中的map方法,参数(函数,量)

    多XX,XX池应用场景

    多XX,特别小规模
    XX池,在问题规模还在可控范围内时使用。

    定时器

    threading模块下的timer方法,参数(数字,函数,多久后执行)

    线程queue

    queue模块,queue.Queue(),队列 LifoQueue后进入先出,堆栈 PriorityQueue 优先级队列。数字越小优先级越高。(优先级,数据)

    事件

    event,有isset方法、wait方法、set方法、clear方法

    并发编程需要掌握

      • 开进程,开线程
      • 生产者消费者模型**
      • GIL全局解释器锁,与,用户自定义的互斥锁
      • 进程池、线程池 --回调机制
  • 相关阅读:
    Swagger 专题
    Spring boot中使用springfox来生成Swagger Specification小结
    Android导航菜单横向左右滑动并和下方的控件实现联动
    Android 日历控件 mCalendarView
    22个值得收藏的android开源代码-UI篇
    java获得指定日期的前一天,后一天的代码
    Java获取当前日期的前一个月,前一天的时间
    Android 获取当前日期算前一年、前一月、前一天Calendar
    [Android]通过setImageURI设置网络上面的图片
    Android-PullToRefresh 使用心得
  • 原文地址:https://www.cnblogs.com/jinyudong/p/7894760.html
Copyright © 2011-2022 走看看