Python 我的热部署(玩具)服务器:需要您的设计输入(家庭作业)

Python 我的热部署(玩具)服务器:需要您的设计输入(家庭作业),python,zeromq,Python,Zeromq,我正在制作一个多工作进程应用程序(暂时不要笑),其中每个工作进程都可以优雅地重新加载。无论何时更新代码,新请求都由具有新代码的新工作进程提供服务。这是这样的 新启动的线程包含更新的代码 确保没有请求被丢弃 我已经做了一个倾听的工人: 当收到aa请求信号时,为请求提供服务 当下一个信号为控制信号时自杀 我是用zeromq做的。客户端使用zeromq连接到此服务器。客户端不通过HTTP进行交互 重新加载代码的好方法是什么?你能解释一个简单而愚蠢的方案吗 我的想法/能力 在主进程中启动一个线程,该

我正在制作一个多工作进程应用程序(暂时不要笑),其中每个工作进程都可以优雅地重新加载。无论何时更新代码,新请求都由具有新代码的新工作进程提供服务。这是这样的

  • 新启动的线程包含更新的代码
  • 确保没有请求被丢弃
  • 我已经做了一个倾听的工人:

  • 当收到aa请求信号时,为请求提供服务
  • 下一个信号为控制信号时自杀
  • 我是用zeromq做的。客户端使用zeromq连接到此服务器。客户端不通过HTTP进行交互


    重新加载代码的好方法是什么?你能解释一个简单而愚蠢的方案吗


    我的想法/能力 在主进程中启动一个线程,该线程进行迭代:

  • 向每个工作进程发出死亡信号
  • 启动新的工作进程
  • 但是这种方法将在最后一个旧工作进程死亡和第一个新工作进程产卵之间删除(我这样配置的)请求



    不,我不是大学生。“家庭作业”只意味着好奇心驱使的追求。

    用python重新加载代码是一种挑战

    下面是我将如何处理它:

    • 在服务器启动时,在HTTP端口上侦听(但不要开始接受连接)
    • 使用多处理或类似的方法来创建一些辅助进程;这应该在套接字开始侦听之后发生,以便子进程继承套接字
    • 然后,每个工作人员都可以
      接受连接和服务请求
    • 当父进程知道应该重新加载时,它会关闭侦听套接字
    • 当工作进程尝试接受一个关闭的套接字时,它会收到一个
      socket.error
      异常,应该终止
    • 父进程可以启动新的主进程(如
      subprocess.Popen(sys.argv)
      ),新进程可以立即开始接受连接
    • 旧流程现在可以等待童工完成;孩子无法接受新连接(因为侦听套接字已关闭)。一旦所有子进程处理完飞行中的请求并关闭,父进程也可以终止

    在python中重新加载代码是一个很好的选择

    下面是我将如何处理它:

    • 在服务器启动时,在HTTP端口上侦听(但不要开始接受连接)
    • 使用多处理或类似的方法来创建一些辅助进程;这应该在套接字开始侦听之后发生,以便子进程继承套接字
    • 然后,每个工作人员都可以
      接受连接和服务请求
    • 当父进程知道应该重新加载时,它会关闭侦听套接字
    • 当工作进程尝试接受一个关闭的套接字时,它会收到一个
      socket.error
      异常,应该终止
    • 父进程可以启动新的主进程(如
      subprocess.Popen(sys.argv)
      ),新进程可以立即开始接受连接
    • 旧流程现在可以等待童工完成;孩子无法接受新连接(因为侦听套接字已关闭)。一旦所有子进程处理完飞行中的请求并关闭,父进程也可以终止

    我在python中实现这一点的方法相当简单,但取决于中间人或消息代理。基本上,我接收消息,处理它并确认它。如果消息未确认,则在超时后,代理将重新对其进行查询


    有了它,您可以简单地终止并重新启动流程。在我的例子中,进程捕获SIGINT并有序关闭。无论它如何死亡,主管都会注意到该工作进程已死亡,并启动一个新的工作进程,该进程将继续处理队列中的消息


    我受到了Erlang的监督树模型的启发,在该模型中,一切都是为了在流程死亡后生存下来而设计的。我甚至让我的工作人员定期向主管发送心跳信号(ZeroMQ PUB to supervisor SUB),以便主管可以在进程因任何原因挂起时终止并重新启动进程。

    我在python中执行此操作的方法相当简单,但取决于中间人或消息代理。基本上,我接收消息,处理它并确认它。如果消息未确认,则在超时后,代理将重新对其进行查询


    有了它,您可以简单地终止并重新启动流程。在我的例子中,进程捕获SIGINT并有序关闭。无论它如何死亡,主管都会注意到该工作进程已死亡,并启动一个新的工作进程,该进程将继续处理队列中的消息


    我受到了Erlang的监督树模型的启发,在该模型中,一切都是为了在流程死亡后生存下来而设计的。我甚至让我的员工定期向主管发送心跳信号(ZeroMQ PUB到supervisor SUB),以便主管可以在进程因任何原因挂起时终止并重新启动它。

    除非这是类的分配;那你就不应该用家庭作业标签了。自主学习没有错;没有一个问题太小,但是家庭作业标签应该表明问题的答案是值得一等学分“…值得一等学分”谢谢你的更正。我看到(或认为我看到了)它是另一种用法。还有文化差异:我离开学校后从未听说过“家庭作业”这个词。我也不知道“在要求做作业之前先做作业”的意思,除非这是课堂作业;那你就不应该用家庭作业标签了。自主学习没有错;没有一个问题太小,但是家庭作业标签应该表明问题的答案是值得一等学分“…值得一等学分”谢谢你的更正。我看到(或认为我看到了)它是另一种用法。和cultu
    from  multiprocessing import Process    
    a=Process(target=worker, args=())
    a.start()