将 Python 对象传递给另一个 Python 进程
Passing Python object to another Python process
假设我们有一个用 Python.
编写的服务器应用程序
还可以说这个主服务器进程在启动时又分叉了两个进程。
服务器等待其客户端,当客户端到来时决定两个分叉进程中的哪一个应该传递客户端的套接字。
我不想每次有客户来就fork一个进程;我想拥有固定数量的服务器,但一个主服务器接收连接,然后将其传递给处理客户端请求的特定工作的服务器。
这个应该是DOS攻击防护,工作分离等等等等
在启动的 Python 程序之间传递 Python 对象有什么技巧吗?
一些共享内存或类似的东西?
pickle 套接字对象并通过 IPC 推送它是否可行?
Would pickling the socket object and pushing it through IPC work?
没有。该对象内部是内核套接字的文件描述符或句柄。它只是进程在进行系统调用时用来识别套接字的数字。
如果您 pickle Python 套接字对象并将其发送到另一个进程,该进程将使用它未打开的套接字的句柄。或者更糟的是,该句柄可能指向不同的打开文件。
最有效的处理方法(在 Linux 上)是这样的:
- 主进程打开监听套接字(例如TCP端口80)
- 主进程派生出 N 个子进程,这些子进程都继承了打开的套接字
- 他们都调用
accept()
并阻塞,等待新连接
- 当一个新的客户端连接时,内核将select具有该套接字句柄的进程之一接受连接;其他人继续等待
这样,您就让内核处理负载平衡。
如果您不希望出现这种情况, 有一种方法(在 UNIX 中)将打开的套接字传递给另一个进程。同样,这不仅仅是手柄;内核有效地将打开的套接字复制到进程的打开文件列表中。这种机制称为 SCM_RIGHTS
,您可以在此处查看示例(C 语言):
http://man7.org/tlpi/code/online/dist/sockets/scm_rights_send.c.html
否则,您的主进程将需要有效地代理与子进程的连接,从而降低系统效率。
假设我们有一个用 Python.
编写的服务器应用程序还可以说这个主服务器进程在启动时又分叉了两个进程。
服务器等待其客户端,当客户端到来时决定两个分叉进程中的哪一个应该传递客户端的套接字。
我不想每次有客户来就fork一个进程;我想拥有固定数量的服务器,但一个主服务器接收连接,然后将其传递给处理客户端请求的特定工作的服务器。
这个应该是DOS攻击防护,工作分离等等等等
在启动的 Python 程序之间传递 Python 对象有什么技巧吗?
一些共享内存或类似的东西?
pickle 套接字对象并通过 IPC 推送它是否可行?
Would pickling the socket object and pushing it through IPC work?
没有。该对象内部是内核套接字的文件描述符或句柄。它只是进程在进行系统调用时用来识别套接字的数字。
如果您 pickle Python 套接字对象并将其发送到另一个进程,该进程将使用它未打开的套接字的句柄。或者更糟的是,该句柄可能指向不同的打开文件。
最有效的处理方法(在 Linux 上)是这样的:
- 主进程打开监听套接字(例如TCP端口80)
- 主进程派生出 N 个子进程,这些子进程都继承了打开的套接字
- 他们都调用
accept()
并阻塞,等待新连接 - 当一个新的客户端连接时,内核将select具有该套接字句柄的进程之一接受连接;其他人继续等待
这样,您就让内核处理负载平衡。
如果您不希望出现这种情况, 有一种方法(在 UNIX 中)将打开的套接字传递给另一个进程。同样,这不仅仅是手柄;内核有效地将打开的套接字复制到进程的打开文件列表中。这种机制称为 SCM_RIGHTS
,您可以在此处查看示例(C 语言):
http://man7.org/tlpi/code/online/dist/sockets/scm_rights_send.c.html
否则,您的主进程将需要有效地代理与子进程的连接,从而降低系统效率。