Python,Asyncore和分叉

时间:2009-11-11 04:48:14

标签: python sockets twisted asyncore

对于初学者来说,我使用Twisted和SocketServer同时使用ForkMixIn,ThreadMixIn并尝试了“线程池”接收。

但是,我想在Python中做一些特别的工作。

小背景。以前我在C中编写了一个简单的TCP守护程序,它将绑定到套接字并监听它,然后预先分叉X,然后将serversocket desc传递给所有分支,每个人都非常非常接受客户端。

我检查了基于asyncore的“select / poll”,我非常喜欢。我唯一的好处是,我可以通过分叉几次来获得一个小的CPU,以利用多CPU机器,并希望最好的安排。

我无法让它适合我的生活。只有一个实例可以接受连接,所有其他实例只是在处理连接时抛出一个异常,'不能通过空迭代'。

这甚至可行吗?我检查了很多,但我找不到任何代码forking 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])

总是在accept中发生,无论我是否在asyncore.loop之前分叉等等。

更新2 :(完整来源) pastebined source

1 个答案:

答案 0 :(得分:2)

你应该使用代码标记进行回溯,否则它会显示混乱,我们看不到异常类型。

但我相信它是TypeError: 'NoneType' object is not iterable,因为self.accept()可以返回None。原因是几个进程可以获得侦听套接字的读取事件,但只有一个可以接受它。其余进程将收到EWOULDBLOCK错误,但会返回None而不是连接地址对。

handle_accept()更改为accept()返回None后立即返回。