python3 queue的多线程

queue分类

python3 queue分三类:

  • 先进先出队列
  • 后进先出的栈
  • 优先级队列
    他们的导入方式分别是:
from queue import Queue
from queue import LifoQueue
from queue import PriorityQueue

具体方法见下面引用说明。

多线程里用queue

设置俩队列,一个是要做的任务队列todo_queue,一个是已经完成的队列done_queue
每次执行线程,先从todo_queue队列里取出一个值,然后执行完,放入done_queue队列。
如果todo_queue为空,就退出。

import logging
import logging.handlers
import threading
import queue

log_mgr = None
todo_queue = queue.Queue()
done_queue = queue.Queue()


class LogMgr:
    def __init__(self, logpath):
        self.LOG = logging.getLogger('log')
        loghd = logging.handlers.RotatingFileHandler(logpath, "a", 0, 1)
        fmt = logging.Formatter("%(asctime)s %(threadName)-10s %(message)s", "%Y-%m-%d %H:%M:%S")
        loghd.setFormatter(fmt)
        self.LOG.addHandler(loghd)
        self.LOG.setLevel(logging.INFO)

    def info(self, msg):
        if self.LOG is not None:
            self.LOG.info(msg)


class Worker(threading.Thread):
    global log_mgr

    def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name

    def run(self):
        while True:
            try:
                task = todo_queue.get(False)
                if task:
                    log_mgr.info("HANDLE_TASK: %s" % task)
                    done_queue.put(1)
            except queue.Empty:
                break
        return


def main():
    global log_mgr
    log_mgr = LogMgr("mylog")

    for i in range(30):
        todo_queue.put("data"+str(i))

    workers = []
    for i in range(3):
        w = Worker("worker"+str(i))
        workers.append(w)

    for i in range(3):
        workers[i].start()

    for i in range(3):
        workers[i].join()

    total_num = done_queue.qsize()
    log_mgr.info("TOTAL_HANDLE_TASK: %d" % total_num)
    exit(0)


if __name__ == '__main__':
    main()


输出日志文件结果:
python3 queue的多线程

参考

https://docs.python.org/3/library/queue.html