threading模块

  • 线程模块方法
  • 线程同步方法 Lock
  • with的作用
  • 线程优先级队列 Queue
  • 信号量 Semaphore
  • 条件变量 condition


python 线程虽然是真线程,但是执行时,有一个GIL锁,对处理相同任务或数据造成不同的影响。
1、以计算为主的程序,处理同一块数据,相当于单线程在运行。最好使用多进程。
2、对于IO密集型较为适用。

线程模块方法

run(): 用以表示线程活动的方法。
start():启动线程活动。
join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
isAlive(): 返回线程是否活动的。
getName(): 返回线程名。
setName(): 设置线程名。

线程同步方法 Lock

使用Thread对象的Lock和Rlock可以实现简单的线程同步,这两个对象都有acquire方法和release方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到acquire和release方法之间,分别表示锁住与释放。

with的作用

with是上下文管理器,Lock锁的使用过程中,acquire和release方法成对出现,相当于一个是__enter__,一个是__exit__,就可以不用显式调用acquire和release方法

线程优先级队列 Queue

Queue.qsize() 返回队列的大小
Queue.empty() 如果队列为空,返回True,反之False
Queue.full() 如果队列满了,返回True,反之False
Queue.full 与 maxsize 大小对应
Queue.get([block[, timeout]])获取队列,timeout等待时间
Queue.get_nowait() 相当Queue.get(False)
Queue.put(item) 写入队列,timeout等待时间
Queue.put_nowait(item) 相当Queue.put(item, False)
Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
Queue.join() 实际上意味着等到队列为空,再执行别的操作

信号量 Semaphore

Semaphore是一个工厂函数,负责返回一个新的信号量对象。Semaphore内部维护一个计数器。每次调用acquare方法都会使内部计数器减一,一旦计数器为负的,则acquare方法会被阻塞,直到其他线程调用release方法,使信号量内部计数器值为正。 计数器初始值为1。
Semaphore的value参数表示内部计数器的初始值,默认值为0,即threading.Semaphore(value=0)信号量主要用在保护有限的资源
例子:

import threading
import time
# 共设置了三个信号量
sm=threading.Semaphore(3)

def connectDb():
    sm.acquire()

    print threading.currentThread().getName()+' connecting to db...\n'

    time.sleep(2)

    print threading.currentThread().getName()+' released db...\n'

    sm.release()


if __name__ == '__main__':
    s1=threading.Thread(target=connectDb,args=())
    s2 = threading.Thread(target=connectDb, args=())
    s3 = threading.Thread(target=connectDb, args=())
    s4 = threading.Thread(target=connectDb, args=())

    s1.start()
    s2.start()
    s3.start()
    s4.start()

运行结果:

Thread-1 connecting to db...

Thread-2 connecting to db...

Thread-3 connecting to db...

Thread-1 released db...

Thread-2 released db...
Thread-3 released db...
# 只有当第三个执行完释放出资源后,第四个才得到资源开始运行。

Thread-4 connecting to db...

Thread-4 released db...


Process finished with exit code 0

条件变量 condition

参考:参考博客

针对线程需要满足条件之后才能够继续执行。
wait([timeout]):线程挂起,直到收到一个notify通知或者超时(可选的,浮点数,单位是秒s),才会被唤醒继续运行。
notify(n=1):通知其他线程,那些挂起的线程接到这个通知之后会开始运行,默认是通知一个正等待该condition的线程,最多则唤醒n个等待的线程。
notifyAll(): 如果wait状态线程比较多,notifyAll的作用就是通知所有线程。

当然,Condition同样需要acquire和release方法对,或with。