python 线程虽然是真线程,但是执行时,有一个GIL锁,对处理相同任务或数据造成不同的影响。
1、以计算为主的程序,处理同一块数据,相当于单线程在运行。最好使用多进程。
2、对于IO密集型较为适用。
run(): 用以表示线程活动的方法。
start():启动线程活动。
join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
isAlive(): 返回线程是否活动的。
getName(): 返回线程名。
setName(): 设置线程名。
使用Thread对象的Lock和Rlock可以实现简单的线程同步,这两个对象都有acquire方法和release方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到acquire和release方法之间,分别表示锁住与释放。
with是上下文管理器,Lock锁的使用过程中,acquire和release方法成对出现,相当于一个是__enter__
,一个是__exit__
,就可以不用显式调用acquire和release方法
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内部维护一个计数器。每次调用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
参考:参考博客
针对线程需要满足条件之后才能够继续执行。
wait([timeout]):线程挂起,直到收到一个notify通知或者超时(可选的,浮点数,单位是秒s),才会被唤醒继续运行。
notify(n=1):通知其他线程,那些挂起的线程接到这个通知之后会开始运行,默认是通知一个正等待该condition的线程,最多则唤醒n个等待的线程。
notifyAll(): 如果wait状态线程比较多,notifyAll的作用就是通知所有线程。
当然,Condition同样需要acquire和release方法对,或with。