2012-07-20 6 views
3

그래서 백그라운드에서 서버를 실행하는 프로세스를 만들고 데몬 프로세스로 시작하려고했습니다.python-gevent 및 python-daemon 관련 문제

그러나
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() 

, 이것은 나에게 오류 제공 : 그래서 내 코드는 내가 경고 온라인 보았다

[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, 그리고 난 그냥 프로그램을 혼자, 메인 등에 배치하여 실행했습니다. 그러나, 내가 그들을 결합하면 물건을 엉망 것으로 보인다. 왜이 사람이 누군지 알 수 있습니까?

답변

7

포크와 epoll (또는 kqueue) 간의 잘못된 상호 작용 문제가 발생합니다. 일반적으로 epoll 기반 이벤트 루프를 포크 후에 안정적으로 작동시키는 것은 어렵습니다. 새로운 이벤트 루프를 다시 만드는 것이 가장 좋습니다.

이 문제를 해결하기 위해 몇 가지 방법 :

  • Upgrade to gevent 1.0.이 때문에 처음 처음 수입하지 않을 경우, 사용하는 경우 이벤트 루프를 만들고 gevent의 0.x는 달리이 문제를 피할 수 있습니다. 또한 libev를 사용하는데, 포크를 libevent보다 약간 더 잘 처리하지만, 100 % 신뢰할 수는 없습니다. gevent를 업그레이드 한 후에 문제가 사라질 가능성이 큽니다.

  • 포크 이후까지 gevent 패키지를 지연 가져옵니다.