Python线程专题10:queue、多线程按顺序执行

上一篇文章: Python线程专题9:线程终止与挂起、实用工具函数
下一篇文章:敬请期待
queue模块实现了各类【多生产者-多消费者】队列。可用于在执行的多个线程之间安全的交换信息。

queue模块定义了3种不一样的队列类。segmentfault

3种不一样的队列类

q=Queue(maxsize):建立一个FIFO(first-in first-out,先进先出)队列。maxsize是队列中金额以放入的项的最大数量。
若是省略maxsize参数或将它置为0,队列大小将无穷大。

q=LifoQueue(maxsize):建立一个LIFO(last-in first-out,后进先出)队列(栈)。

q=PriorityQueue(maxsize):建立一个优先级队列,其中项按照优先级从低到高依次排好。
使用这种队列时,项应该是(priority,data)形式的元组,其中priority时一个标识优先级的数字。

经常使用方法

q.size():返回队列的正确大小。由于其余线程可能正在更新此队列,因此此方法的返回数字不可靠。

q.empty():若是队列为空,返回True,不然返回False。

q.full():若是队列已满,返回True,不然返回False。

q.put(item,block,timeout):将item放入队列。
若是block设为True(默认值),调用者将被阻塞直到队列中出现可用的空闲位置为止。
若是block设为False,队列满时此方法将引起Full异常。

q.put_nowait(item):等价于q.put(item,False)

q.get(block,timeout):从队列中删除一项,而后返回这个项。
若是block设为True(默认值),调用者将阻塞,直到队列中出现可用的空闲为止。
若是block设为False,队列为空时将引起Empty异常。
timeout提供可选的超时值,单位为秒,若是超时,将引起Empty异常。

q.get_nowait():等价于get(0)

q.task_done():在队列种数据的消费者用来指示对于项的处理已经结束。若是使用此方法,那么从队列中删除的每一项都应该调用一次。

q.join():阻塞直到队列中的全部项均被删除和处理为止。一旦为队列中的每一项都调用了一次q.task_done()方法,此方法将会直接返回。

实例:安全

使用 队列通常能够简化多线程的程序。例如,可使用共享队列将线程链接在一块儿,而没必要依赖锁的保护。

在这种模型下,工做者线程通常充当数据的消费者。多线程

from threading import Thread
from queue import Queue
class WorkerThread(Thread):
    def __init__(self,*args,**kwargs):
        Thread.__init__(self,*args,**kwargs)
        self.input_queue=Queue()

    def send(self,item):
        self.input_queue.put(item)
    def close(self):
        self.input_queue.put(None)
        self.input_queue.join()
    def run(self):
        while True:
            item=self.input_queue.get()
            if item is None:
                break
            #实际开发中,此处应该使用有用的工做代替
            print(item)
            self.input_queue.task_done()
        #完成,指示收到和返回哨兵
        self.input_queue.task_done()
        return

if __name__=="__main__":
    w=WorkerThread()
    w.start()
    w.send("Mark")
    w.send("好")
    w.send("TM")
    w.send("帅")
    w.close()

运行结果:函数

Mark
好
TM
帅

多线程按顺序执行

直接看实例吧,控制多线程的执行顺序:工具

代码:ui

#控制多线程的执行顺序
from threading import Thread,Lock
import time

class Task1(Thread):
    def run(self):
        while True:
             if lock1.acquire():
                print("---Task1---")
                time.sleep(0.5)
                lock2.release()
class Task2(Thread):
    def run(self):
        while True:
             if lock2.acquire():
                print("---Task2---")
                time.sleep(0.5)
                lock3.release()
class Task3(Thread):
    def run(self):
        while True:
             if lock3.acquire():
                print("---Task3---")
                time.sleep(0.5)
                lock1.release()
#建立lock实例1,第一个开始不上锁
lock1=Lock()
lock2=Lock()
lock2.acquire()
lock3=Lock()
lock3.acquire()

t1=Task1()
t2=Task2()
t3=Task3()

t1.start()
t2.start()
t3.start()

结果:线程

---Task1---
---Task2---
---Task3---
---Task1---
---Task2---
---Task3---
---Task1---
---Task2---
---Task3---
---Task1---
---Task2---
---Task3---
...
相关文章
相关标签/搜索