0

問題はプロキシ プログラムで発生しました。G10K を考慮して、プログラムで gevent を使用し、低レベルの gevent.core を使用してすべての機能を実行しています。

プログラムを複数のプロセスに変更する前に。全て大丈夫。しかし、それを変更すると、問題が発生します。

問題は、プロセス NO.2がソケットを受け入れると、プロセス NO.1 のイベントがディスパッチを停止することです。そして、イベントに sleep(0.1) を追加すると、驚きました。しかし、スリープ時間を短くすると、問題が再び発生しました。

この問題は 1 週間私を悩ませましたが、まだそれとは何の関係もありません。誰か助けてくれませんか?

私はそのようなイベントを使用します:

    core.init()
    self.ent_s_send = core.event(core.EV_WRITE,self.conn.fileno(),\
                            self.ser_send,[self.conn,self.body])
    self.ent_s_send.add()
    core.dispatch()
4

1 に答える 1

1

このコードは同じ共有ソケットで正常に動作しているため、問題はコードにあると思います。

EV_READ でソケットを受け入れる場合、クライアント ソケットを取得し、メイン ソケットに対する制御を解放する必要があります。書き込んではいけません。次のようなコードを使用する必要があります。

try:
    client_socket, address = sock.accept()
except socket.error, err:
    if err[0] == errno.EAGAIN:
        sys.exc_clear()
        return
    raise
core.event(core.EV_READ, client_socket.fileno(), callback)
core.event(core.EV_WRITE, client_socket.fileno(), callback)
core.event(core.EV_READ | core.EV_WRITE, client_socket.fileno(), callback)

この後、このソケットに READ および WRITE イベントを設定します。

于 2011-09-15T18:50:21.253 に答える