2014-02-18 68 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