Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

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/