我在决定如何提供一些 Python 脚本时遇到了很大的问题。
问题是基本功能可以这样概括:
do_something()
time.sleep(3)
do_something()
我尝试了各种WSGI 服务器,但它们都给了我并发限制,比如我必须指定要使用多少线程等等。
我只希望服务器上的资源得到有效和自由的使用。
有任何想法吗?
我在决定如何提供一些 Python 脚本时遇到了很大的问题。
问题是基本功能可以这样概括:
do_something()
time.sleep(3)
do_something()
我尝试了各种WSGI 服务器,但它们都给了我并发限制,比如我必须指定要使用多少线程等等。
我只希望服务器上的资源得到有效和自由的使用。
有任何想法吗?
您可能会发现Spawning非常适合。它有几个部署选项,其中之一是有点透明的异步(由Eventlet实现)。所以,如果你真的做到time.sleep(3)
了,那就没问题了。并非您可能做的所有事情都是透明处理的,因此您必须注意 Eventlet 及其工作原理。例如,套接字是这样的,因此如果您从套接字读取(并且该套接字阻塞),它不会停止服务器或消耗线程。但是,如果您执行 CPU 繁重的工作,则会阻止所有请求。所以……这有点棘手。Spawning 还有一些其他部署选项也可能对您有用。
您也许可以使用WaitForIt,尽管它有一些问题。它将为长时间运行的请求生成线程,并提供一些浏览器反馈,因此如果您正在为长时间运行的后端进程创建一个非常简单的前端,它可能会很有用。它充当 WSGI 中间件。
你检查过龙卷风的非阻塞异步请求吗?
虽然我从未使用过它,但这里有一个来自 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()
CherryPy WSGI 服务器呢?
那是什么sleep
意思?您真的在编写 Web 应用程序吗?
所以客户端被捆绑等待回答3秒是可以的,但服务器不行吗?这似乎……很奇怪。
如果您不想让客户端占用 3 秒钟,一种常见的机制是让初始请求尽快返回“202 Accepted”,并带有一个指向状态监视器的 URL。然后服务器可以为该任务生成一个新的线程或子进程,客户端可以做其他事情,然后轮询状态 URL 以了解任务何时完成。