import daemon import time import logging import logging.handlers import multiprocessing from multiprocessing import Event from src.usb import Usb from src.mqtt import Mqtt from src.payload import USBdata from src.config import Config import signal from daemon.pidfile import PIDLockFile class App(): def __init__(self): # 加载配置文件 self.cfg = Config() def run(self): signal.signal(signal.SIGINT, self.exit) signal.signal(signal.SIGTERM, self.exit) # signal.signal(signal.SIGKILL, self.exit) signal.signal(signal.SIGHUP, self.exit) # 初始化日志 log = logging.getLogger('gateway') log.setLevel(logging.DEBUG) # 实际运行一般用info # 创建一个StreamHandler对象,用于将日志输出到终端上 console = logging.StreamHandler() console.setLevel(logging.DEBUG) # 终端上只显示DEBUG及以上级别的日志 # 创建一个RotatingFileHandler对象,用于将日志写入到指定路径的文件中 fh = logging.handlers.RotatingFileHandler(self.cfg.Sys.logpath, maxBytes=1000000, backupCount=1) # 滚动式日志文件位置、大小、数量部署时按需修改 fh.setLevel(logging.DEBUG) # 为两个Handler对象设置日志记录格式 formatter = logging.Formatter(u'%(asctime)s [%(levelname)s] %(message)s') # 日志格式 console.setFormatter(formatter) fh.setFormatter(formatter) # 将console和fh两个Handler对象添加到Logger对象log中 log.addHandler(console) log.addHandler(fh) # 公共队列 q1 = multiprocessing.Queue() q2 = multiprocessing.Queue(maxsize=50) # 公共事件 self.event = Event() # 处理线程,包括参数计算和MQTT发送 mqtt = Mqtt(self.cfg.Mqtt, log) err = mqtt.Connect() # TODO: mqtt连不上怎么办? # 暂时考虑,连不上等待10秒继续连接 while err != 0: log.error("正在重连...") err = mqtt.Connect() time.sleep(10) USBdata_thread = multiprocessing.Process(target=USBdata, args=(q1, q2, log)) mqtt_thread = multiprocessing.Process(target=mqtt.Start, args=(q2, self.event, self.cfg.Mqtt)) # USB线程 usb = Usb(self.cfg.Usb, log) err = usb.Connect() if err != 0: exit(err) USBGetInfo = multiprocessing.Process(target=usb.WriteDataWork, args=(q1, self.event)) USBKeepAliveWork = multiprocessing.Process(target=usb.KeepAliveWork) USBGetInfo.start() USBKeepAliveWork.start() mqtt_thread.start() USBdata_thread.start() USBGetInfo.join() USBKeepAliveWork.join() mqtt_thread.join() USBdata_thread.join() log.info("program exit!") usb.Disconnect() mqtt.Disconnect() def exit(self, signum, frame): self.event.set() app = App() pidfile = PIDLockFile(app.cfg.Sys.pidpath) # 判断pid文件是否存在或锁定 if pidfile.is_locked(): pidfile.break_lock() # with daemon.DaemonContext(pidfile=pidfile): app.run()