python并发编程问题
从main出发,一个应用会有多个进程启动。我想用自带的logging,将应用所有的日志都收集起来一起打印,使用是可以跨进程的queue方式。
主进程准备一个queue,创建个logging.handlers.QueueHandler(q)实例,添加到固定的一个logger,然后开个线程消费这个queue. 后端使用的tornado框架。
实际使用我发现web服务的logging无法打印到控制台,日志文件,原因是这个queue,在不同的进程下虽然实例地址相同,但是实际取不到,这是为什么,怎么处理。
核心代码如下:
主进程开启将business日志都打入qx中,单开线程对business日志进行处理。
from multiprocessing import freeze_support, Pool, Manager, Queue
def begin(self):
qx = Queue()
buzLog = logging.getLogger("business")
buzLog.setLevel(initData["logLevel"])
buzLog.addHandler(qh)
lp = threading.Thread(target=logger_thread, args=(qx,))
lp.start()
def logger_thread(q):
while True:
record = q.get()
if record is None:
break
if record.name is None:
logger = logging.getLogger("root")
logger.handle(record)
else:
elif record.name == 'business':
logger = logging.getLogger('buz')
logger.handle(record)
else:
logger = logging.getLogger(record.name)
logger.handle(record)
业务就正常的进行打印
Logger = logging.logger("business")
class HealthHandler(BaseHandler, ABC):
def post(self):
Logger.info("happy")
跟进的过程中,所有代码都执行了,新线程阻塞在record = q.get()等待queue。
Logger.info("happy")执行中,
执行了这个方法,logging.handlers.QueueHandler.emit()
这个方法对QueueHandler就一句话: self.queue.put_nowait(record)
可以看出塞进去了。
但是,问题出现了。
record = q.get()根本收不到,导致这个queue越来越大,没人消费,这是怎么回事,怎样处理呢。