2014-02-18 69 views
0

我有这样的方法:GEVENT,HTTP/CGI非阻塞服务器

class dJobs(): 
    def server(self): 
     address = ('127.0.0.1', dConfig.cgiport) 
     handler = CGIHTTPServer.CGIHTTPRequestHandler 
     handler.cgi_directories = ['/cgi-bin'] 
     self.logger.info("starting http server on port %s" %str(port)) 
     httpd = BaseHTTPServer.HTTPServer(address, handler) 
     httpd.serve_forever() 

    def job(self): 
     self.runNumber = 0 
     while True: 
      self.logger.info("Counting: %s" %str(self.runNumber)) 
      self.runNumber+=1 
      time.sleep(1) 

我想在等待HTTP和CGI请求运行作业,处理请求,然后继续工作方法。 使用gevent(以及如何)可以做到这一点,或者我需要使用线程吗?

即我想同时运行这两种方法而不创建线程。

+0

你能修理你的缩进吗? – Bach

+0

对不起,现在好些了? – salvo

+0

你可以按原样运行吗?当我尝试时,我得到'IndentationError:预计一个缩进块'。您可能想要缩进这些方法。 – Bach

回答

0

该解决方案似乎为我工作:

  • 进口猴子:

    from gevent import monkey 
    monkey.patch_all(thread=False) 
    
  • 加载并运行此方法:

    def run(self): 
        jobs = [gevent.spawn(self.server),gevent.spawn(self.job)] 
        gevent.joinall(jobs) 
    

请尝试一下在你的程序中。

+0

这也适用于我,谢谢,这正是我一直在寻找的。 – salvo

0

如果你的工作是CPU限制的,你不能使用Python线程,因为​​。替代方案是multiprocessing模块。

也可以使用uWSGI - 它可以做CGI并运行jobs。看看这是uWSGI的主要功能的WSGI,您可能想使用它来代替CGI。

+0

这两个解决方案都不可行,因为我的应用程序将是一个进程守护进程(双分叉)。无论如何,谢谢你让我知道一个非常有用的工具(uWSGI)。 – salvo

+0

@salvo然后提供更多信息,了解您的限制以及您为什么认为自己拥有这些限制。 – jwalker