0

我在决定如何提供一些 Python 脚本时遇到了很大的问题。

问题是基本功能可以这样概括:

do_something()
time.sleep(3)
do_something()

我尝试了各种WSGI 服务器,但它们都给了我并发限制,比如我必须指定要使用多少线程等等。

我只希望服务器上的资源得到有效和自由的使用。



有任何想法吗?

4

4 回答 4

1

您可能会发现Spawning非常适合。它有几个部署选项,其中之一是有点透明的异步(由Eventlet实现)。所以,如果你真的做到time.sleep(3)了,那就没问题了。并非您可能做的所有事情都是透明处理的,因此您必须注意 Eventlet 及其工作原理。例如,套接字是这样的,因此如果您从套接字读取(并且该套接字阻塞),它不会停止服务器或消耗线程。但是,如果您执行 CPU 繁重的工作,则会阻止所有请求。所以……这有点棘手。Spawning 还有一些其他部署选项也可能对您有用。

您也许可以使用WaitForIt,尽管它有一些问题。它将为长时间运行的请求生成线程,并提供一些浏览器反馈,因此如果您正在为长时间运行的后端进程创建一个非常简单的前端,它可能会很有用。它充当 WSGI 中间件。

于 2010-04-22T19:13:15.327 回答
1

你检查过龙卷风的非阻塞异步请求吗?

http://www.tornadoweb.org/

虽然我从未使用过它,但这里有一个来自 doc 的示例:

class MainHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        http = tornado.httpclient.AsyncHTTPClient()
        http.fetch("http://friendfeed-api.com/v2/feed/bret",
                   callback=self.async_callback(self.on_response))

    def on_response(self, response):
        if response.error: raise tornado.web.HTTPError(500)
        json = tornado.escape.json_decode(response.body)
        self.write("Fetched " + str(len(json["entries"])) + " entries "
                   "from the FriendFeed API")
        self.finish()
于 2010-04-22T17:55:10.460 回答
0

CherryPy WSGI 服务器呢?

那是什么sleep意思?您真的在编写 Web 应用程序吗?

于 2010-04-22T15:33:23.847 回答
0

所以客户端被捆绑等待回答3秒是可以的,但服务器不行吗?这似乎……很奇怪。

如果您不想客户端占用 3 秒钟,一种常见的机制是让初始请求尽快返回“202 Accepted”,并带有一个指向状态监视器的 URL。然后服务器可以为该任务生成一个新的线程或子进程,客户端可以做其他事情,然后轮询状态 URL 以了解任务何时完成。

于 2010-04-22T20:27:00.880 回答