多线程 threading模块

Python中的多线程操作有两种方式: 函数式(thread)和继承(threading.Threading)式

python是支持多线程的,并且是native的线程。主要是通过thread和threading这两个模块来实现的。thread是比较底层的模 块,threading是对thread做了一些包装的,可以更加方便的被使用。

函数式

1
2
3
4
def function adbc()
threading.Thread(target=fun,args=(a,b))
或者
thread.start_new_thread(fun,(a,b))启动线程

守护进程

如果你的主线程在退出的时候,不用等待那些子线程完成,那就设置这些线程的 daemon 属性。即,在线程开始 thread.start()之前,调用setDeamon()函数,设定线程的daemon标志。thread.setDaemon(True)就表示这个线程“不重要”。

如果你想等待子线程完成再退出,那就什么都不用做。,或者显示地调用thread.setDaemon(False),设置daemon的值为false。新的子线程会继承父线程的daemon标志。整个Python会在所有的非守护线程退出后才会结束,即进程中没有非守护线程存在的时候才结束。

根据原装官方文档的解释,主线程在所有非守护线程都死亡后才会被kill,这样当你忘记使用threading.Thread.exit_thread()或者thread_stop()的时候,嘿嘿,你的程序中主线程收到结束信号,但是因为有一个非守护进程的存在,所以等待。

Queue模块

Queue模块实现了多生产者、多消费者队列。它特别适用于信息必须在多个线程间安全地交换的多线程程序中。这个模块中的Queue类实现了所有必须的锁语义。它依赖于Python中线程支持的可用性;参见threading模块。

特性参数

模块实现了三类队列:FIFO(First In First Out,先进先出,默认为该队列)、LIFO(Last In First Out,后进先出)、基于优先级的队列。以下为其常用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
先进先出 q = Queue.Queue(maxsize)
后进先出 a = Queue.LifoQueue(maxsize)
优先级 Queue.PriorityQueue(maxsize)
Queue.qsize() 返回队列的大小
Queue.empty() 如果队列为空,返回True,反之False
Queue.full() 如果队列满了,返回True,反之False
Queue.full 与 maxsize 大小对应
Queue.put(item) 写入队列,timeout等待时间 非阻塞
Queue.get([block[, timeout]]) 获取队列,timeout等待时间
Queue.get_nowait() 相当Queue.get(False)
Queue.put_nowait(item) 相当Queue.put(item, False)
Queue.task_done() 在完成一项工作之后,函数向任务已经完成的队列发送一个信号
Queue.join(): 实际上意味着等到队列为空,再执行别的操作