質問

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

しかし、私は Python で何か特定のことを動作させたかったのです。

ちょっとした背景。以前、私はソケットにバインドしてそれをリッスンする単純な TCP デーモンを C で書きました。その後、X を何度も事前にフォークし、すべてのフォークにサーバーソケットの記述を渡すだけで、誰もがクライアントを非常にうまく受け入れることができます。

私がとても気に入っている「select/poll」ベースの asyncore をチェックしてみました。私の唯一の利点は、マルチ CPU マシンを利用して、スケジューリングで最善の結果を期待できるように、数回フォークすることで CPU の束縛を少し解除できたことです。

私は一生それをうまく機能させることはできません。接続を受け入れることができるのは 1 つのインスタンスのみであり、他のすべてのインスタンスは単に接続の処理時に例外をスローし、「空では反復できません」となります。

これは実現可能なのでしょうか?いろいろ調べましたが、asyncore ディスパッチャーをフォークするためのコードが見つかりませんでした (泣)

ありがとう!

アップデート 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 の前でフォークするかどうかに関係なく、受け入れ時に常に発生します。

更新 2:(完全なソース) ペーストバインされたソース

役に立ちましたか?

解決

トレースバックにはコード マークアップを使用する必要があります。そうしないと、表示がおかしくなり、例外の種類が表示されません。

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

変更してください handle_accept() いつでもすぐに戻る accept() 戻り値 None.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top