TCP 版は挫折

マルチプロセスだと色々制約が出てくるので epoll/kqueue + multiprocessing + tcp は出来てません。
from multiprocessing import _multiprocessing を使ってファイルディスクリプタを別プロセスに unix domain socket 経由で渡してもいいのですが、それだとパケット受けるプロセスと、投げるプロセスが別になるだけで複数のマルチプロセスを前もって起動しておくワーカープールのような方法が取れません。暇そうなプロセスにひたすら accept 後のファイルディスクリプタを渡したい ... 。

ファイルディスクリプタを別プロセスに移動する方法は unix domain socekt 経由(つまり pipe) くらいしか理解してないのでうーん ... 。ワーカープール方式の場合は悲しいけどマルチプロセスではなくマルチスレッドじゃないとダメなのかなぁとか思っています。

id:mopemope が _multiprocessing.recvfd/ _multiprocessing.sendfd を使った multiprocessing の echo サーバを書いていますが、あれを epoll/kqueue にするだけなら簡単なのですが、やりたいこととは違うのでどうしようかなぁと悩み中。

どなたか素敵な方法をご存じないかなぁ。まぁ Python でやらないで Erlang でイイじゃんと言われたらそれまでなのですが。

追記

結論としては考え方がお粗末だった、という結論。回答としては Apache のような prefork モデルをするしかない。
Scoket 生成してから fork しまくってあとは別プロセスが accept 待ちするという処理。これが嫌な場合は Thread モデルを採用するしかない。