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

标签 python sockets object ipc

假设我们有一个用 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/

相关文章:

class - 多态到底是什么?

java - 创建一个公共(public)静态对象不好吗

python - 查询、Redland 和 python 绑定(bind)问题

python - 使用 musixmatch python 包装器时出错

Python:多线程还是循环?

python - 比较单列中的值

python - 如何一次向 Tornado 套接字客户端广播消息?

android - 音频流输入 block 掉线了吗?

javascript - 将对象保存在数组中以获取高分列表

python - 非常简单的 python 客户端/服务器工作,但奇怪的延迟