Python、Asyncore与进程分叉
首先,我使用了Twisted和SocketServer,尝试了ForkMixIn、ThreadMixIn,还试过“线程池”的方法。
不过,我想在Python中实现一些特定的功能。
给你一点背景知识。我之前用C语言写了一个简单的TCP守护进程,它会绑定到一个套接字上并进行监听,然后预先分叉(fork)X次,把服务器的套接字描述符传给所有的分叉进程,这样每个进程都能很高兴地接收客户端的连接。
我查看了基于“select/poll”的asyncore,我非常喜欢这个方法。唯一的问题是,我希望通过分叉几次来充分利用多核CPU的优势,但调度的结果却不太理想。
我怎么也搞不定这个问题。只有一个实例能接受连接,其他的都在处理连接时抛出异常,提示“无法遍历空对象”。
这到底可行吗?我查了很多资料,但找不到任何关于分叉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源代码
1 个回答
2
你应该用代码格式来显示错误信息,不然看起来会很乱,我们也看不到具体的错误类型。
我觉得这个错误是 TypeError: 'NoneType' object is not iterable
,因为 self.accept()
可能会返回 None
。原因是有多个进程可以接收监听套接字的事件,但只有一个进程可以接受连接。其他进程会收到 EWOULDBLOCK
的错误,这个错误会被捕获,但之后它会返回 None
,而不是连接地址和对。
你可以修改你的 handle_accept()
方法,让它在 accept()
返回 None
时立即返回。