【问题标题】:Python, Asyncore and forksPython、Asyncore 和分叉
【发布时间】:2009-11-11 04:48:14
【问题描述】:

对于初学者,我将 Twisted 和 SocketServer 与 ForkMixIn、ThreadMixIn 一起使用,并尝试了“线程池”接收器。

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

一点背景。以前我用 C 写了一个简单的 TCP 守护程序,它会绑定到一个套接字并监听它,然后多次预分叉 X,然后将 serversocket desc 传递给所有分叉,每个人都会非常非常愉快地接受客户端。

我查看了我非常喜欢的基于“选择/轮询”的异步核心。我唯一的不满是我可以通过分叉几次来获得一点 CPU 不受限制,以利用多 CPU 机器并希望通过调度获得最好的结果。

我不能让它为我的生活服务。只有 1 个实例可以接受连接,所有其他实例在处理连接时简单地抛出一个异常,“不能通过 Empty 进行迭代”。

这甚至可行吗?我检查了很多,但我找不到任何用于分叉异步调度程序的代码(哭)

谢谢!

更新 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])

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

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

【问题讨论】:

  • 你能用确切的回溯更新问题吗?
  • 完成了,很抱歉一开始没有这样做。我太傻了。
  • 还添加了完整的源代码,以防万一有人有时间并且愿意试一试。很抱歉没有从一开始就包含所有相关内容。

标签: python sockets twisted asyncore


【解决方案1】:

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

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

将您的handle_accept() 更改为在accept() 返回None 时立即返回。

【讨论】:

  • 你完全正确。尝试接受并返回。谢谢! Большое спасибо моему Московскому коллеге :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2013-09-14
相关资源
最近更新 更多