python 线程退出方法

FIFO是常用的队列,其一些常用的方法有:

    Queue.qsize()  返回队列大小

    Queue.empty()  判断队列是否为空

    Queue.full()  判断队列是否满了

    Queue.get([block[,timeout]])  从队列头删除并返回一个item,block默认为True,表示当队列为空却去get的时候会阻塞线程,等待直到有有item出现为止来get出这个item。如果是False的话表明当队列为空你却去get的时候,会引发异常。在block为True的情况下可以再设置timeout参数。表示当队列为空,get阻塞timeout指定的秒数之后还没有get到的话就引发Full异常。

    Queue.put(...[,block[,timeout]])  向队尾插入一个item,同样若block=True的话队列满时就阻塞等待有空位出来再put,block=False时引发异常。同get的timeout,put的timeout是在block为True的时候进行超时设置的参数。

    Queue.task_done()  从场景上来说,处理完一个get出来的item之后,调用task_done将向队列发出一个信号,表示本任务已经完成

    Queue.join()  监视所有item并阻塞主线程,直到所有item都调用了task_done之后主线程才继续向下执行。这么做的好处在于,假如一个线程开始处理最后一个任务,它从任务队列中拿走最后一个任务,此时任务队列就空了但最后那个线程还没处理完。当调用了join之后,主线程就不会因为队列空了而擅自结束,而是等待最后那个线程处理完成了。

线程退出可以设置标志位,使用队列获取数据的线程可以将queue.get设置阻塞超时。

 一个简单的由队列获取数据的线程的如何退出的例子:

import queue
import sys 
import threading

def worker(name, q, exit_flag):
    while not exit_flag.is_set():
        try:
            # 超时控制,便于及时响应exit_flag
            item = q.get(timeout=3)
        except queue.Empty:
            continue
        print('thread {}, item {}'.format(name, item), file=sys.stderr)
        q.task_done()

def main():
    # 线程退出标志位
    exit_flag = threading.Event()
    exit_flag.clear()

    # 创建共享队列和线程池
    q = queue.Queue()
    num_of_threads = 5 
    threads = [threading.Thread(target=worker, args=(str(i+1), q, exit_flag))
               for i in range(num_of_threads)]
    for t in threads:
        t.start()
    for i in range(50):
        q.put(i)
    q.join()

    # 任务处理完成,通知线程退出,并join等待
    exit_flag.set()
    for t in threads:
        t.join()
        
if __name__ == '__main__':
    main()

 

你可能感兴趣的:(python 线程退出方法)