多线程
Python提供thread模块支持多线程。
import thread
def f1(lock):
None
lock.release()
def f2(lock):
None
lock.release()
def main():
lock1= thread.allocate_lock()
lock1.acquire()
thread.start_new_thread(f1,(lock1))
lock2= thread.allocate_lock()
lock2.acquire()
thread.start_new_thread(f2,(lock2))
if __name__ == ‘__main__’:
main()
start_new_thread()要求一定要有前两个参数。就算运行的函数不要参数,也要传一个空的元组。
Python 不推荐使用thread模块,因为thread模块不支持守护线程。
更高级的线程模块是threading模块。
threading 模块对象
threading 模块对象 描述
Thread 表示一个线程的执行的对象
Lock 锁原语对象(跟 thread 模块里的锁对象相同)
RLock 可重入锁对象。使单线程可以再次获得已经获得了的锁(递归锁定)。
Condition 条件变量对象能让一个线程停下来,等待其它线程满足了某个“条件”。
如,状态的改变或值的改变。
Event 通用的条件变量。多个线程可以等待某个事件的发生,在事件发生后,所有的线程都会被激活。
Semaphore 为等待锁的线程提供一个类似“等候室”的结构
BoundedSemaphore 与 Semaphore 类似,只是它不允许超过初始值
Timer 与 Thread 相似,只是,它要等待一段时间后才开始运行。
Thread 对象的函数
函数 描述
start() 开始线程的执行
run() 定义线程的功能的函数(一般会被子类重写)
join(timeout=None) 程序挂起,直到线程结束;如果给了 timeout,则最多阻塞 timeout 秒
getName() 返回线程的名字
setName(name) 设置线程的名字
isAlive() 布尔标志,表示这个线程是否还在运行中
isDaemon() 返回线程的 daemon 标志
setDaemon(daemonic) 把线程的 daemon 标志设为 daemonic(一定要在调用 start()函数前调用)
生产者-消费者问题和 Queue 模块
常用的Queue 模块的属性
函数 描述
Queue 模块函数
queue(size) 创建一个大小为 size 的 Queue 对象
Queue 对象函数
qsize() 返回队列的大小(由于在返回的时候,队列可能会被其它线程修改,所以这个
值是近似值)
empty() 如果队列为空返回 True,否则返回 False
full() 如果队列已满返回 True,否则返回 False
put(item, block=0) 把item 放到队列中,如果给了 block(不为0),函数会一直阻塞到队列中有空间为止
get(block=0) 从队列中取一个对象,如果给了 block(不为 0),函数会一直阻塞到
队列中有对象为止
多线程相关的标准库模块
模块 描述
thread 基本的,底级别的线程模块
threading 高级别的线程和同步对象
Queue 供多线程使用的同步先进先出(FIFO)队列
mutex 互斥对象
SocketServer 具有线程控制的 TCP 和UDP 管理器