почему новая запись процесса затем перестает запускаться события старого процесса при совместном использовании сокета прослушивания для нескольких процессов? - PullRequest
0 голосов
/ 24 августа 2011

Проблема возникла в моей прокси-программе. Учитывая G10K, я использую gevent в своей программе и использую низкоуровневый gevent.core для запуска всех своих функций.

Прежде чем я изменю свою программу на несколько процессов. все отлично. Но когда я его поменял, появляется проблема.

Я считаю, что проблема заключается в том, что, когда процесс № 2 принимает сокет, события процесса № 1 останавливают отправку. И если я добавлю сон (0,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()

1 Ответ

1 голос
/ 15 сентября 2011

Я думаю, что проблема в вашем коде, потому что этот код работает нормально, с тем же общим сокетом.

Когда вы принимаете sa ocket с 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 для этого сокета.

...