2

手始めに、ForkMixInとThreadMixInの両方でTwistedとSocketServerを使用し、「スレッドプール」受信を試しました。

しかし、私はPythonで何か特別な機能を作りたかったのです。

少し背景。以前、私はCで、ソケットにバインドしてそれをリッスンする単純なTCPデーモンを作成し、Xを何度もプリフォークしてから、サーバーソケットの説明をすべてのフォークに渡すだけで、誰もが非常に結婚してクライアントを受け入れました。

私はたくさん好きな「select/poll」ベースの非同期をチェックしました。私の唯一の強みは、マルチCPUマシンを利用するために数回フォークして、スケジューリングで最高のものを期待することで、CPUを少し解放できることでした。

私はそれを私の人生のために働かせることができません。接続を受け入れることができるのは1つのインスタンスのみであり、他のすべてのインスタンスは接続の処理時に例外をスローするだけで、「空を介して反復することはできません」。

これも実現可能ですか?たくさんチェックしましたが、非同期ディスパッチャーをフォークするためのコードが見つかりませんでした(叫び)

ありがとうございました!

更新1:(要求に応じて完全なトレースバック)

error: uncaptured python exception, closing channel <__main__.EchoServer listening 0.0.0.0:8001 at 0x2ad4880c93f8> (<type 'exceptions.TypeError'>:'NoneType' /python2.6/asyncore.py|readwrite|99] [/usr/local/python2.6.9/lib/python2.6/asyncore.py|handle_read_event|408] [./6py-server.py|handle_accept|87])

asyncore.loopなどの前にフォークしたかどうかに関係なく、常にacceptで発生します。

アップデート2:(フルソース) pastebinedソース

4

1 に答える 1

2

トレースバックにはコードマークアップを使用する必要があります。そうしないと、混乱して表示され、例外タイプが表示されません。

しかし、私はそれが戻ることができるTypeError: 'NoneType' object is not iterableのであると信じています。その理由は、複数のプロセスがリッスンソケットの読み取りイベントを取得できますが、それを受け入れることができるのは1つだけだからです。残りのプロセスはキャッチされたエラーを受け取りますが、接続とアドレスのペアの代わりに戻ります。self.accept()NoneEWOULDBLOCKNone

handle_accept()に戻ったらすぐにaccept()戻るように変更しますNone

于 2009-11-11T06:33:48.647 に答える