gpt4 book ai didi

Python 3 套接字 - 我可以在停止并重新运行程序时保持套接字打开吗?

转载 作者:行者123 更新时间:2023-11-28 21:42:20 25 4
gpt4 key购买 nike

我一直在绞尽脑汁想弄清楚这是否可行。

我有一个服务器程序运行着来自全国各地的大约 30 个不同的套接字连接。我现在需要更新这个服务器程序,虽然客户端设备会自动重新连接,但它并不完全可靠。

我想知道是否有办法将套接字对象保存到文件中?然后在服务器重新启动时重新加载它?或者即使在程序停止后也强行保持套接字打开。这样客户端就永远不会断开连接。

真的可以在这里使用热插拔代码!

最佳答案

解决方案 1.

它可以通过一些过程魔术来完成,至少在 linux 下(尽管我相信类似的 windows api 存在)。首先请注意套接字不能存储在文件中。这些对象本质上是临时的。但是您可以将它们放在一个单独的进程中。看看这个:

Can I open a socket and pass it to another process in Linux

因此,实现此目的的一种方法如下:

  1. 在某个时候创建​​一个“守护者”进程(确保该进程不是主进程的子进程,以便在主进程消失时它仍然存在)
  2. 使用 SCM_RIGHTS 通过 sendmsg() 将所有套接字发送到 keeper 进程
  3. 关闭主进程
  4. 做任何你必须做的更新
  5. 启动主进程
  6. 从 keeper 进程中获取套接字
  7. 关闭 keeper 进程

但是这个解决方案很难维护。您有两个独立的进程,不清楚哪个是主进程,哪个是从进程。所以你可能需要在顶部有另一个主进程。事情很快就会变得糟糕,更不用说安全问题了。

解决方案 2.

按照@gavinb 的建议重新加载模块可能是一种解决方案。但请注意,在实践中,这通常会破坏应用程序。除非您知道您使用的每个 Python 文件的代码,否则您永远不知道这些模块在幕后做了什么。此外,它对模块施加了一些限制,即它们必须是可重新加载的。例如,一些模块使用内联缓存,这使得重新加载变得困难。

此外,一旦一个模块被加载到另一个模块中,它就会保留对该模块的引用。因此,您不仅需要重新加载它,还需要更新之前加载它的所有其他模块中的引用。除非您在项目开始时就考虑过,否则维护成本会很快增加(以便封装每个 import 以便于重新加载)。由在同一进程中运行的两个不同版本的模块引起的错误(我想,虽然从来没有遇到过这种情况)极难找到。

无论如何我都会避免这种情况。

解决方案 3.

所以这是 XY 问题。与其保存套接字,不如在主服务器前面放一个代理怎么样? IMO 这是最安全同时也是最简单的解决方案。代理将与主服务器通信(例如通过 unix 域套接字)并将缓冲数据并在主服务器再次可用时自动重新连接到主服务器。也许你甚至可以重用一些现有的技术,例如nginx.

关于Python 3 套接字 - 我可以在停止并重新运行程序时保持套接字打开吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43739576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com