线程

线程

线程:进程中工作的流水线,具体功能执行某一段代码

线程与进程的区别:

线程共享创建它的进程的地址空间,进程拥有它们自己的地址空间。线程可以直接访问其进程的数据段;进程具有父进程的数据段的自身副本。

线程可以直接与其进程的其他线程通信,进程必须使用进程间通信来与兄弟进程通信。新线程容易创建创建成本远远低于进程(创建速度远远高于进程),新进程需要复制父进程。线程可以对同一进程的线程执行相当大的控制,进程只能对子进程执行控制。

对主线程的更改(取消、优先级更改等)可能会影响进程的其他线程的行为,对父进程的更改不影响子进程。

线程中其他方法:

threading.currentThread(): 返回当前的线程变量。

threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。

threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

守护线程:

对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕,其他和进程一样

锁死和递归锁:

所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程

递归锁:在Python中为了支持在同一线程中多次请求同一资源,python提供了可重入锁RLock。这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁:

信号量:

Semaphore管理一个内置的计数器,每当调用acquire()时内置计数器-1;

调用release() 时内置计数器+1;计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。

 

posted @ 2018-04-26 14:49  tianyu105529  阅读(75)  评论(0编辑  收藏  举报