gpt4 book ai didi

python - 将 Python 对象传递给另一个 Python 进程

转载 作者:行者123 更新时间:2023-11-28 22:35:47 30 4
gpt4 key购买 nike

假设我们有一个用 Python 编写的服务器应用程序。

还可以说这个主服务器进程在启动时又 fork 了两个进程。

服务器等待它的客户端,当客户端到来时决定两个 fork 进程中的哪一个应该传递客户端的套接字。

我不想在每次客户到来时都 fork 一个进程;我想要有固定数量的服务器,但是一个接收连接的主服务器,然后将它传递给处理客户端请求的特定工作的服务器。

这个应该是DOS攻击防护,job分离等等

在启动的 Python 程序之间传递 Python 对象有什么技巧吗?

一些共享内存或类似的东西?

pickle 套接字对象并通过 IPC 推送它是否可行?

最佳答案

Would pickling the socket object and pushing it through IPC work?

没有。该对象内部是内核套接字的文件描述符或句柄。它只是进程在进行系统调用时用来识别套接字的一个数字。

如果您对该 Python 套接字对象进行 pickle 并将其发送到另一个进程,该进程将使用它未打开的套接字的句柄。或者更糟的是,该句柄可能指向另一个打开的文件。

(在 Linux 上)最有效的处理方式是这样的:

  • 主进程打开监听套接字(例如 TCP 端口 80)
  • 主进程 fork N 个子进程,他们都继承打开的套接字
  • 他们都调用accept() 并阻塞,等待新的连接
  • 当一个新的客户端连接时,内核将选择一个具有该套接字句柄的进程来接受连接;其他人会继续等待

这样,您就可以让内核处理负载平衡。

如果您不希望出现这种情况, 有一种方法(在 UNIX 中)将打开的套接字传递给另一个进程。同样,这不仅仅是 handle ;内核有效地将打开的套接字复制到进程的打开文件列表中。此机制称为 SCM_RIGHTS,您可以在此处查看示例(C 语言): http://man7.org/tlpi/code/online/dist/sockets/scm_rights_send.c.html

否则,您的主进程将需要有效地代理与子进程的连接,从而降低系统的效率。

关于python - 将 Python 对象传递给另一个 Python 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37992318/

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