为什么一个新进程条目然后旧进程的事件在共享多个进程的侦听套接字时停止运行?

时间:2011-08-24 10:30:57

标签: python sockets multiprocessing gevent

问题发生在我的代理程序中,考虑到G10K,我在程序中使用gevent,并使用低级gevent.core来运行我的所有功能。

在将程序更改为多个进程之前。一切都好。但是当我改变它时,问题出现了。

我发现问题是当进程NO.2 接受套接字时,进程NO.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 个答案:

答案 0 :(得分:1)

我认为问题出在您的代码中,因为this code工作正常,使用相同的共享套接字。

当您接受带有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事件。