2017-03-31 4 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フラスコ+ geventはメモリを解放しません。 limit.conf

まず、30MBのメモリと3つのスレッドで起動しました。 しかし、このサーバーで一括「/ do」リクエストを送信した後、 メモリは12スレッドで60MBに増加します。送信はすべてリクエストされますが。このメモリ使用量は変更されません。

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ファイルカウントを使用すると思います。 limit.confファイルで設定したファイル数より少ないファイル数を使用するようにPythonを制限するにはどうすればよいですか?

答えて

0

pythonがビジー状態のときにソケットを再利用していないようですので、spawnでリクエストを送信するときにlimit.confのファイル制限までソケットをもう一度作成します。

私はちょうどこのpythonプロセスの制限を与えました。私は、以下のこのオプションを使用して、竜巻のhttpサーバとAsyncHttpClientを使用することにしました

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

==更新==

しかし、ライブラリがまだメモリを大量に消費する要求..

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

このコードを「インポート」の下のグローバル領域に記述する必要があります。

とすぐに送信依頼が終わってから使用しています。

@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..})) 
関連する問題