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()
输出日志文件结果: