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全局解释器锁,与,用户自定义的互斥锁
    • 进程池、线程池 --回调机制
posted @ 2017-11-25 11:23  jinyudong  阅读(141)  评论(0编辑  收藏  举报