Passing Python object to another Python process

百般思念 提交于 2019-12-12 17:18:28

问题


Let say we have a server application written in Python.

Let also say that this main server process forked two more processes at the startup.

Server awaits its clients, and when one comes decides to which of two forked processes should pass the client's socket.

I do not want to fork a process each time a client comes; I want to have fixed number of servers, but one main server that receives a connection, then pass it to a server that deals with a specific work client asked for.

This should be a DOS attack protection, job separation, etc. etc.

Is there any trick to pass a Python object between started Python programs.

Some shared memory or something like that?

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


回答1:


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

No. Inside that object is a file descriptor or handle to the kernel socket. It's just a number that the process uses to identify the socket when making system calls.

If you pickle that Python socket object and send it to another process, that process will be using a handle for a socket it didn't open. Or worse, that handle may refer to a different open file.

The most efficient way to handle this (on Linux) is like this:

  • Master process opens listening socket (e.g. TCP port 80)
  • Master process forks N children who all inherit that open socket
  • They all call accept() and block, waiting for a new connection
  • When a new client connects, the kernel will select one of the processes with a handle to that socket to accept the connection; the others will continue to wait

This way, you let the kernel handle the load balancing.

If you don't want this behavior, there is a way (in UNIX) to pass an open socket to another process. Again, this is more than just the handle; the kernel effectively copies the open socket to your processs's open file list. This mechanism is known as SCM_RIGHTS, and you can see an example (in C) here: http://man7.org/tlpi/code/online/dist/sockets/scm_rights_send.c.html

Otherwise, your master process will need to effectively proxy the connection to the child processes, reducing thr efficiency of the system.



来源:https://stackoverflow.com/questions/37992318/passing-python-object-to-another-python-process

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!