【问题标题】:Gevent,http/cgi non blocking serverGevent,http/cgi 非阻塞服务器
【发布时间】:2014-03-18 05:47:44
【问题描述】:

我有这个方法:

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(以及如何)执行此操作,或者我需要使用线程?

即我想在不创建线程的情况下同时运行这两种方法。

【问题讨论】:

  • 你能修复你的缩进吗?
  • 你能按原样运行吗?当我尝试时,我得到IndentationError: expected an indented block。您可能想要缩进这些方法。
  • 对,当然,我以为你在谈论标签。

标签: python cgi gevent concurrent-programming


【解决方案1】:

这个解决方案似乎对我有用:

  • 进口猴子:

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

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

请在你的程序中试一试。

【讨论】:

    【解决方案2】:

    如果你的工作是 CPU 密集型的,你不能使用 Python 线程,因为 GIL。替代方案是multiprocessing 模块。

    您也可以使用uWSGI——它可以使用CGI 并运行jobs。看看 WSGI,它是 uWSGI 的主要特性,你可能想用它来代替 CGI。

    【讨论】:

    • 这两种解决方案都不可行,因为我的应用程序将是一个单进程守护程序(双分叉)。无论如何,谢谢,你让我知道了一个非常有用的工具(uWSGI)。
    • @salvo 然后提供更多信息,说明您的限制是什么以及您认为自己有限制的原因。