如何持续集成(CI)一个永远运行的关键Python应用程序?

如何持续集成(CI)一个永远运行的关键Python应用程序?,python,jenkins,continuous-integration,jenkins-pipeline,Python,Jenkins,Continuous Integration,Jenkins Pipeline,我用Python编写了一个全天候运行的加密交易机器人。我想通过CI软件Jenkins不断将新功能和错误修复集成到此应用程序。但问题是,我不能只是关闭应用程序,签出最新版本,然后重新启动应用程序;因为bot在任何给定时间都可能有要出售的活动交易(当前处于交易中)。关闭该应用程序将使机器人无法跟踪其订单。我正在考虑将我的活动交易数据转储到数据库中,杀死应用程序,更新它,重新启动它,然后从数据库加载交易数据,以恢复机器人对交易的感知。但我不确定这是否是最好的方法。总的来说,有更好的方法吗 节约状态考虑

我用Python编写了一个全天候运行的加密交易机器人。我想通过CI软件Jenkins不断将新功能和错误修复集成到此应用程序。但问题是,我不能只是关闭应用程序,签出最新版本,然后重新启动应用程序;因为bot在任何给定时间都可能有要出售的活动交易(当前处于交易中)。关闭该应用程序将使机器人无法跟踪其订单。我正在考虑将我的活动交易数据转储到数据库中,杀死应用程序,更新它,重新启动它,然后从数据库加载交易数据,以恢复机器人对交易的感知。但我不确定这是否是最好的方法。总的来说,有更好的方法吗

  • 节约状态考虑使用
  • 倾听系统信号以触发正常关机,如下所示:

    import signal
    ... 
    
    def handler_stop_signals(*args, **kwargs):
     """ Handle system signals
        only SIGTERM expected to trigger this"""
    
        Log.log(__name__).info('Gracefully shutting down')
        my_process.shutdown()
    
    
    if __name__ == 'main':   
        signal.signal(signal.SIGTERM, handler_stop_signals)
    
    不需要不同的进程、cli和api。注册一个监听器,一旦发出信号,这个回调就会启动。 欲了解更多信息,请访问


  • 然后,当您想使用jenkins部署新版本时,只需停止或终止服务,然后部署并启动。

    是否有方法向应用程序发出信号,使其顺利退出?1。您还可以将所有应用程序状态存储在内存共享服务(如redis)中,还允许您运行多个机器人实例。2.例如,编写逻辑以侦听SIGTERM,然后通过不开始任何新交易而优雅地退出。。如果是关键性的,您应该有多个实例,以便在另一个实例因任何原因(预期或非预期)下跌时可以介入。@Urban48我的应用程序作为电报机器人接口。这就是我查询正在进行的交易、系统状态和关闭bot的方式。当我命令它关闭时,它将在所有活动交易执行后立即安排关闭事件。但是这个电报接口对詹金斯没有用处。我已经阅读了Redis,谢谢你的建议,我可以在应用程序重新启动时使用它加载我的交易数据。但我现在的问题是,如何将像
    kill
    这样的外部kill信号传播到我的应用程序中,并处理它以正常退出?我正在考虑为我的应用程序创建CLI接口。@Urban48所以我的问题是,既然我的应用程序是多线程的,那么是否可以创建一个线程,该线程具有侦听外部命令的CLI?谢谢您的回答。对你的建议稍加修改;我没有使用Redis,而是使用SQLite。这很符合我的目的。