通过Queue控制线程并发,并监控队列执行进度

# -*- coding:utf-8 -*-
import Queue
import time
import threading

# 需要执行的业务主体
def domain(id):
    time.sleep(2)
    print(id, "done")


class update_proccess(threading.Thread):
    def __init__(self,queue_list):
        threading.Thread.__init__(self)
        self.queue_list = queue_list

    def run(self):
        while True:
            try:
                if self.queue_list.qsize() == 0:
                    break
                print(u"surplus:",self.queue_list.qsize())
                # 没隔1秒检测一下队列的长度,由此判断队列的执行情况
                time.sleep(1)
            except Queue.Empty:
                break

class myThread(threading.Thread):
    def __init__(self, queue_list):
        threading.Thread.__init__(self)
        self.queue_list = queue_list

    def run(self):
        while True:
            try:
                # 获取队列,获取时需要阻塞,不设置阻塞的话会一直去尝试获取资源
                task = self.queue_list.get(block = True, timeout = 1)
            except Queue.Empty:
                break
            # 取到数据,开始处理(依据需求加处理代码)
            domain(task)
            # 处理完主体业务代码后需要将该队列的资源释放
            self.queue_list.task_done()


# 创建指定长度的队列
queue_list = Queue.Queue(10)

# 向资源池里面放10个数用作测试
for i in range(10):
    queue_list.put(i)

# 开Thread_num个线程
for i in range(0, 2):
    worker = myThread(queue_list)
    worker.start()
# 开启队列监控线程
update_proccess(queue_list).start()

queue_list.join() #等待所有的队列资源都用完

 

posted @ 2018-08-14 11:22  一个和🔥有缘的人  阅读(627)  评论(0编辑  收藏  举报