首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有关python-gevent和python-daemon的问题

有关python-gevent和python-daemon的问题
EN

Stack Overflow用户
提问于 2012-07-20 21:27:58
回答 1查看 2K关注 0票数 3

因此,我一直试图创建一个运行后台服务器的进程,并使用守护进程启动它。所以我的代码是:

代码语言:javascript
复制
class App():
  def __init__(self):
    self.stdin_path = '/dev/null'
    self.stdout_path = '/dev/tty'
    self.stderr_path = '/dev/tty'
    self.pidfile_path = '/tmp/foo.pid'
    self.pidfile_timeout = 5
  def run(self):
    server = WSGIServer(('localhost',28080),handle_request)
    server.serve_forever()

if __name__ == '__main__':
  app = App()
  daemon_runner = runner.DaemonRunner(app)
  daemon_runner.do_action()

但是,这给了我一个错误:

代码语言:javascript
复制
[warn] Epoll ADD(1) on fd 5 failed.  Old events were 0; read change was 1 (add); write change was 0 (none): Invalid argument
Traceback (most recent call last):
  File "enrollmentrunner2.py", line 110, in <module>
    daemon_runner.do_action()
  File "/usr/lib/python2.7/dist-packages/daemon/runner.py", line 186, in do_action
    func(self)
  File "/usr/lib/python2.7/dist-packages/daemon/runner.py", line 131, in _start
    self.app.run()
  File "enrollmentrunner2.py", line 105, in run
    server.serve_forever()
  File "/usr/lib/python2.7/dist-packages/gevent/baseserver.py", line 188, in serve_forever
    self.start()
  File "/usr/lib/python2.7/dist-packages/gevent/baseserver.py", line 149, in start
    self.start_accepting()
  File "/usr/lib/python2.7/dist-packages/gevent/server.py", line 99, in start_accepting
    self._accept_event = core.read_event(self.socket.fileno(), self._do_accept, persist=True)
  File "core.pyx", line 308, in gevent.core.read_event.__init__ (gevent/core.c:3960)
  File "core.pyx", line 252, in gevent.core.event.add (gevent/core.c:2952)
IOError: [Errno 22] Invalid argument

我在网上寻找警告,但在任何地方都找不到,而这个错误并没有给我太多有用的信息。我运行了这里描述的程序,https://stackoverflow.com/a/9047339,我单独运行了这个程序,只是把它放到了主程序中,等等。然而,当我把它们结合起来的时候,似乎会把事情搞砸。有人知道为什么会这样吗?

EN

回答 1

Stack Overflow用户

发布于 2012-07-27 11:59:47

您遇到了叉子和epoll (或kqueue)之间交互不良的问题。一般来说,要使基于epoll的事件循环在fork之后可靠地工作是很困难的,最好是重新创建一个新的事件循环。

有几种解决问题的方法:

  • 升级到gevent 1.0。与gevent 0.x不同,它在第一次使用时创建事件循环,而不是在第一次导入时创建事件循环,从而避免了问题。它也使用libev,它处理叉略好于libevent,虽然不是100%可靠。你的问题很有可能在你升级gevent之后就消失了。
  • 将gevent包的导入延迟到叉子之后。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11587164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档