multiprocessing.pyはファイル記述子を交換できそう
preforkなサーバーを書いてみようと思い、参考にpython2.6から使えmultiprocessing.pyを見てみた。
APIのドキュメントを見るとsendmsgとか使えなさそうな感じ。
なのでmultiprocessing.pyでは親プロセスでacceptしたソケットを子プロセスに転送して処理するような方式が使えなさそうだが。。。
Modules/_multiprocessing/multiprocessing.c
89 #if HAVE_FD_TRANSFER 90 91 /* Functions for transferring file descriptors between processes. 92 Reimplements some of the functionality of the fdcred 93 module at http://www.mca-ltd.com/resources/fdcred_1.tgz. */ 95 static PyObject * 96 multiprocessing_sendfd(PyObject *self, PyObject *args) 97 { 98 int conn, fd, res; 99 char dummy_char; 100 char buf[CMSG_SPACE(sizeof(int))]; 101 struct msghdr msg = {0}; 102 struct iovec dummy_iov; 103 struct cmsghdr *cmsg; 104 105 if (!PyArg_ParseTuple(args, "ii", &conn, &fd)) 106 return NULL; 107 108 dummy_iov.iov_base = &dummy_char; 109 dummy_iov.iov_len = 1; 110 msg.msg_control = buf; 111 msg.msg_controllen = sizeof(buf); 112 msg.msg_iov = &dummy_iov; 113 msg.msg_iovlen = 1; 114 cmsg = CMSG_FIRSTHDR(&msg); 115 cmsg->cmsg_level = SOL_SOCKET; 116 cmsg->cmsg_type = SCM_RIGHTS; 117 cmsg->cmsg_len = CMSG_LEN(sizeof(int)); 118 msg.msg_controllen = cmsg->cmsg_len; 119 *(int*)CMSG_DATA(cmsg) = fd; 120 121 Py_BEGIN_ALLOW_THREADS 122 res = sendmsg(conn, &msg, 0); 123 Py_END_ALLOW_THREADS 124 125 if (res < 0) 126 return PyErr_SetFromErrno(PyExc_OSError); 127 Py_RETURN_NONE; 128 }
実はあるっぽい。
C拡張なので_multiprocessingモジュールだけど。
まあとはいえ自分で書いてみるけども。
その他のsendmsg、ファイル記述子の交換など
[Python-Dev] socket module recvmsg/sendmsg
Issue 1194378: sendmsg() and recvmsg() for C socket module - Python tracker
python-eunuchs · PyPI
Lurker - Database message source pull failure
http://twistedmatrix.com/trac/browser/sandbox/therve/prefork/