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

时间:2016-06-23 12:56:33

标签: python sockets object ipc

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

还要说这个主服务器进程在启动时分叉了两个进程。

服务器等待其客户端,当有人决定两个分叉进程中的哪一个应该通过客户端的套接字时。

每次客户来时,我都不想分叉流程;我想拥有固定数量的服务器,但是一个主服务器接收连接,然后将其传递给服务器,该服务器处理要求的特定工作客户端。

这应该是DOS攻击保护,作业分离等等。

在启动的Python程序之间传递Python对象是否有任何技巧。

一些共享内存或类似内容?

腌制套接字对象并推动IPC工作吗?

1 个答案:

答案 0 :(得分:4)

  

腌制套接字对象并推动IPC工作吗?

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

如果你挑选那个Python套接字对象并将其发送到另一个进程,那么该进程将使用一个它没有打开的套接字的句柄。或者更糟糕的是,该句柄可能引用不同的打开文件。

处理此问题的最有效方法(在Linux上)是这样的:

  • 主进程打开侦听套接字(例如TCP端口80)
  • 主进程分叉所有继承该开放套接字的
  • 的N个孩子
  • 他们都呼叫accept()并阻止,等待新连接
  • 当新客户端连接时,内核将选择一个具有该套接字句柄的进程来接受连接;其他人将继续等待

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

如果您不想要这种行为,那么就是一种方式(在UNIX中)将一个打开的套接字传递给另一个进程。同样,这不仅仅是手柄;内核有效地将打开的套接字复制到进程的打开文件列表中。这种机制称为SCM_RIGHTS,你可以在这里看到一个例子(在C中): http://man7.org/tlpi/code/online/dist/sockets/scm_rights_send.c.html

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