2017-03-31 438 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..}))