| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- __author__ = 'James Iter'
- __date__ = '2018/9/30'
- __contact__ = 'james.iter.cn@gmail.com'
- __copyright__ = '(c) 2018 by James Iter.'
- import traceback
- import signal
- import time
- import os
- import threading
- from jimvc.models import app_config, logger
- from jimvc.models import EventProcessor, Init
- from jimvc.models import Utils
- from jimvc import app
- from jimvc import ws_engine_for_vnc
- threads = []
- # noinspection PyBroadException
- try:
- signal.signal(signal.SIGTERM, Utils.signal_handle)
- signal.signal(signal.SIGINT, Utils.signal_handle)
- pid = os.fork()
- if pid == 0:
- ws_engine_for_vnc()
- else:
- # 父进程退出时,会清理所有提前退出的子进程的环境。所以这里无需对子进程做等待操作。
- # 即:即使子进程提前退出,且因父进程没有做wait处理,使其变成了僵尸进程。但当父进程退出时,会对因其所产生的僵尸进程做统一清理操作。
- from jimvc.models import Database as db
- if db.r.hincrby(app.config['global_lock'], 'EventProcessor') == 1:
- # 避免该进程奔溃,重启后无法再次启动如下线程。故对该 key 设定 10 秒生存周期。
- # 即 10 秒钟后奔溃,被 gunicorn 重启后的进程,依然可以启动如下线程。
- db.r.expire(app.config['global_lock'], 10)
- t_ = threading.Thread(target=EventProcessor.launch, args=())
- threads.append(t_)
- t_ = threading.Thread(target=Init.clear_expire_monitor_log, args=())
- threads.append(t_)
- t_ = threading.Thread(target=Init.pub_sub_ping_pong, args=())
- threads.append(t_)
- for t in threads:
- t.start()
- except:
- logger.error(traceback.format_exc())
- exit(-1)
- if __name__ == '__main__':
- # noinspection PyBroadException
- try:
- app.run(host=app_config['listen'], port=app_config['port'], use_reloader=False, threaded=True)
- while True:
- if Utils.exit_flag:
- # 主线程即将结束
- break
- time.sleep(1)
- # 等待子线程结束
- for t in threads:
- t.join()
- print 'Main say bye-bye!'
- except:
- logger.error(traceback.format_exc())
- exit(-1)
|