代码之家  ›  专栏  ›  技术社区  ›  ddd

如何在生产中更新python应用程序

  •  0
  • ddd  · 技术社区  · 7 年前

    我编写了一个python应用程序,它作为守护进程在linux服务器上运行。它所做的就是倾听一个rabbitmq主题。每当有新消息时,应用程序将按以下5个步骤处理该消息。

    1. 查询数据库并获取字符串格式的音频数据。
    2. 将音频数据转换为WAV。
    3. 调用深度学习模型对音频进行预测
    4. 将wav上传到s3 bucket
    5. 将结果发送回web api。

    主程序使用多线程运行:

    for i in range(2):
        t = threading.Thread(target=process_msg, name='worker-%s' % i)
        t.setDaemon(True)
        t.start()
    while True:
        time.sleep(5)
    

    回调函数 process_msg 是执行5个步骤的方法。

    目前,我是这样将更改部署到开发服务器的。

    1. 终止应用程序的活动进程
    2. git pull 获取更新
    3. 再次启动应用程序。

    这个手工过程对开发人员来说是可以的,但对生产却没有好处。因为如果在处理消息的过程中停止应用程序,它将在不完成作业的情况下退出。在不中断进程的情况下,使用cicd这个应用程序的最佳方法是什么?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Urban48    7 年前

    有很多方法可以做到这一点。 这是我能为你想到的最简单的方法。

    置信区间/置信区间

    1. 不要使用git作为代码交付基础设施。 每次运行私有pip存储库并创建版本化的pip包 你想发布新的代码-你也可以控制正在发布的功能。

    2. 使用jenkins自动化流程

    3. 当你部署新代码时,你所做的就是pip安装-u my_app=1.2.3 在服务器上,然后重新启动应用程序。

    不中断进程,也没有什么选择 ……

    这里有一个:

    将代码作为服务运行(systemd、systemv、upstart)。
    安装代码(希望使用pip)之后,可以使用以下命令 service my_app restart

    在你的应用程序中添加一些代码来收听sigterm 如:

    import signal
    
    def handler_stop_signals(*args, **kwargs):
        """ Handle system signals
        only SIGTERM expected to trigger this"""
    
        logger.info('Shutting down gracefully ')
        # wait for all tasks to finish before exiting 
    
    
    signal.signal(signal.SIGTERM, handler_stop_signals)
    

    每次重新启动应用程序时,此处理程序将被调用back,并执行您将写入的逻辑以正常关闭。

    TLDR公司 以下内容:

    使用jenkins发布代码的pip包。
    使用jenkins将pip包部署到目标服务器。
    调整代码以监听系统信号并相应地采取行动

    附言:
    更高级的解决方案可能是(仅限Linux的解决方案)将代码打包到Debian包中并将它们发送出去。
    你可以使用像 debpackager 为了达到这个目的