使用 web.py 作为非阻塞 http-server

Posted

技术标签:

【中文标题】使用 web.py 作为非阻塞 http-server【英文标题】:Using web.py as non blocking http-server 【发布时间】:2010-10-04 19:06:16 【问题描述】:

在学习一些基本的 Python 编程时,我发现了 web.py。一世 遇到了一个愚蠢的问题:

我编写了一个简单的控制台应用程序,其中包含一个处理项目的主循环 来自单独线程中的队列。我的目标是使用 web.py 添加 项目到我的队列并通过 Web 请求报告队列的状态。一世 让它作为一个模块运行,但不能将它集成到我的主应用程序中。 我的问题是当我用 app.run() 启动 http 服务器时,它会阻止我 主循环。 也尝试用 thread.start_new_thread 启动它,但它仍然 块。 有没有一种简单的方法来运行 web.py 的集成 http 服务器 我的应用程序中的背景。

万一我是一个基本问题的受害者 误解,任何试图澄清我的推理错误的尝试都会 帮助 ;.) (请多多包涵,我是初学者 :-)

【问题讨论】:

你不应该回答这个问题。 【参考方案1】:

我找到了一个可行的解决方案。在一个单独的模块中,我创建了我的网络服务器:

import web
import threading
class MyWebserver(threading.Thread):

    def run (self):
        urls = ('/', 'MyWebserver')
        app = web.application(urls, globals())
        app.run()

    def POST ...

在主程序中我只是调用

MyWebserver().start()

而不是在让网络服务器在后台工作的同时继续我想要的任何东西。

【讨论】:

我在用 Ctrl+C 杀死这个程序时遇到问题,其他人可以确认吗? 请注意,您可能必须在类的初始化过程中添加线程的初始化,如下所示:def __init__(self): threading.Thread.__init__(self) @puk 设置 MyWebServer.daemon = True【参考方案2】:

将你的主循环代码重写为一个你一遍又一遍地调用的函数,然后从你传递给runsimple的函数中调用它不是更简单...

保证不能完全满足您的要求,但如果您赶时间,这可能是最简单的。

【讨论】:

【参考方案3】:

或者只使用 Tornado,一个用于 Python 的非阻塞网络服务器,其 API 类似于 webpy - http://www.tornadoweb.org/

【讨论】:

【参考方案4】:

我最近还使用Beanstalkd 来排队将在单独线程中运行的任务。您的 web.py 处理程序只是将一个作业放入管道中,然后由一个完全独立的脚本执行它。您可以拥有任意数量的这些,并获得高级队列控制等的好处。

【讨论】:

以上是关于使用 web.py 作为非阻塞 http-server的主要内容,如果未能解决你的问题,请参考以下文章

Tornado入门

tornado

Tornado

tornado

tornado 框架2

Tornado