2017-03-31 439 views
0
#packages. 
greenlet==0.4.11 
Flask==0.11.1 

#centos, /etc/security/limit.conf 
* soft nofile 65535 
* hard nofile 65535 

这是我的测试代码(python 3.5)我跑了这个并观察了内存使用情况。python flask + gevent不释放内存。 limit.conf

首先,它具有3个线程的30MB内存。 但在此服务器上发送批量“/ do”请求后, 内存将增加至60MB,并有12个线程。尽管发送和每个请求都已完成。这个内存使用情况没有改变。

from gevent import monkey;monkey.patch_all(thread=False) 
import gevent 
from flask import Flask, request 
from gevent.pywsgi import WSGIServer 
import requests 

app = Flask(__name__) 


@app.route("/do", methods=['GET', 'POST']) 
def ping(): 
    data = request.get_json() 
    gevent.spawn(send_request, data) 

    return 'pong' 


def send_request(data): 
    resp = requests.get("http://127.0.0.1:25000/ping", data=data) 
    if resp.text != 'pong': 
     app.logger.error(resp.text) 


if __name__ == "__main__": 
    http = WSGIServer(("0.0.0.0", 9999), app) 
    http.serve_forever() 

    end_server = True 
    app.logger.info("Server will be closed") 

我觉得这个python使用了所有可用的65535个文件数。 如何限制python使用少于我在limit.conf文件中配置的文件数量?

回答

0

python似乎不忙重复使用套接字,所以它使得套接字重新覆盖,直到发送请求时的限制.conf nofile限制。

所以,我只给了这个python进程的限制。

import resource 
resource.setrlimit(resource.RLIMIT_NOFILE, (1024, 1024)) 

== ==更新

但要求库仍然会消耗大量的内存..

我决定用龙卷风HTTP服务器和AsyncHttpClient下面这个选项,

AsyncHTTPClient.configure("tornado.simple_httpclient.SimpleAsyncHTTPClient", max_clients=1000) 
tornado.netutil.Resolver.configure("tornado.netutil.ThreadedResolver") 

您需要将此代码写入“导入”下面的全局区域。

和使用gen.moment完成请求后立即发送。

@gen.coroutine 
def get(self): 
    self.write("pong") 
    self.finish() 
    yield gen.moment 
    resp = yield self.application.http_client.fetch("...url...", method='POST', headers={"Content-Type": "application/json"}, 
              body=json.dumps({..data..}))