这个Python脚本最佳的WSGI服务器是什么?
我在决定怎么运行几个Python脚本时遇到了麻烦。
问题是,基本功能可以用以下方式来概括:
do_something()
time.sleep(3)
do_something()
我尝试了各种WSGI服务器,但它们都让我遇到了并发限制,比如我必须指定要使用多少线程等等。
我只是希望服务器上的资源能够高效且自由地使用。
有什么好的建议吗?
4 个回答
0
所以说,客户端等个3秒钟没问题,但服务器就不行?这听起来有点奇怪。
如果你不想让客户端等3秒钟,有一种常见的方法是让最开始的请求尽快返回“202 已接受”,并提供一个状态监控的链接。这样,服务器就可以开启一个新的线程或者子进程来处理任务,而客户端可以去做其他事情,然后再去查看那个状态链接,看看任务什么时候完成。
1
你可以试试Spawning这个工具。它有几种部署方式,其中一种是比较透明的异步处理(这是通过Eventlet实现的)。所以如果你直接写了time.sleep(3)
,那也是可以的。不过,并不是你做的所有事情都能被透明处理,所以你需要稍微了解一下Eventlet是怎么工作的。例如,套接字(sockets)就是这样,如果你从一个套接字读取数据(而这个套接字会阻塞),它不会让服务器停止或者占用一个线程。但是如果你做的是需要大量CPU计算的工作,那就会阻塞所有请求。所以……这有点复杂。Spawning还有其他一些部署选项,可能也适合你。
你也可以考虑使用WaitForIt,不过它有一些需要注意的地方。它会为长时间运行的请求创建线程,并提供一些浏览器反馈,所以如果你是在做一个非常简单的前端来处理长时间运行的后台进程,这可能会很有用。它的作用是作为WSGI中间件。
1
你有没有试过用Tornado来处理非阻塞的异步请求呢?
我自己没用过,不过这里有个文档里的例子:
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()