2016-12-07 16 views
0

私は現在、分散コンピューティングに取り組んでいます。 私のワーカーは結果をmongoDBデータベースに挿入して返します。コードは正常に動作しますが、接続は開いたままで、システムのソケットが不足しています。 はここに私のワーカーのコードである:このコマンドを使用することによりpymongoを強制的にソケットを閉じることができますか?

def worker(elt): 
    client=pymongo.MongoClient(MONGODB_URI) 
    db = client.get_default_database() 
    essaiElt = db['essaiElt'] 
    #compute here 
    essaiElt.insert(elt.toDict()) 
    client.close() 

「netstatコマンド-anbo」私はまだ開かれたすべてのソケットを見ることができる(以上3000)、労働者の最大数は14ですが、彼らはより多くに対処する必要があり10 000タスクより

... 
TCP 10.130.151.11:4999 10.130.137.128:27017 En attente 0 
TCP 10.130.151.11:5000 10.130.137.128:27017 En attente 0 

私はタイムアウトを設定しようとしましたが、何の効果もありません。

私のデータベースを再起動せずにソケットを閉じるにはどうしたらいいですか?

のPython 2.7.12 Pymongo 3.3 MongoDBの3.2.10

+0

「ここで計算する」セクションの実行時間はどのくらいですか?単一のPythonプロセスは、プロセスが終了する前に、多くのドキュメントをデータベースに挿入するか、1つだけ挿入しますか? –

+0

「ここで計算する」セクションの実行時間はどのくらいですか? 実際は空です。 1つのPythonプロセスは、プロセスが終了する前に、多数のドキュメントをデータベースに挿入するか、1つだけ挿入しますか? ワーカーはppライブラリ(並列Python)で管理されます それで、タスクを取得し、ソケットを作成し、要素を挿入し、ソケットを閉じて、同じことをもう一度行うために別のタスクを取得します。したがって、一人の作業者が最終的に多くのソケットを作成します。 –

答えて

0

おそらく何が起こっているあなたは、クライアントを作成文書を挿入、および、毎秒何回クライアントを閉じ、です。 MongoClientは、シャットダウン処理を完了するまでに2〜2時間かかります。 (MongoClientはサーバーごとにバックグラウンドスレッドを開始し、これらのスレッドは即座に終了しません)。MongoClientがソケットを完全に閉じても、MongoDBサーバーはTCP接続に関連するすべてのリソースをクリーンアップし、OSのネットワークレイヤーはクリーンアップに数分かかります。 (Wikipedia's TCP entryにTIME-WAIT状態を参照してください。)

一般的に、あなたはPythonのプロセスの開始時に1 MongoClientを作成し、そのPythonのプロセス生涯を通じて1 MongoClientを使用する必要があります。

client = pymongo.MongoClient(MONGODB_URI) 

def worker(elt):  
    db = client.get_default_database() 
    essaiElt = db['essaiElt'] 
    #compute here 
    essaiElt.insert(elt.toDict()) 

ドン」操作ごとに新しいMongoClientを作成します。決してそれを閉じないでください。

the PyMongo FAQ参照:

プロセスごとに一度、このクライアントを作成し、すべての操作のためにそれを再利用します。リクエストごとに新しいクライアントを作成するのはよくある間違いであり、非常に非効率的です。

+0

「決して閉じないでください。 - いつ閉じますか? –

+1

Pythonプロセスが終了すると自動的に閉じます。それ以前にMongoClientを閉じる理由はありません。 –

+0

それは貴重な情報です! 'pymongo'デベロッパーが' .close'メソッドを徹底的に暴露していると言っていますか、それとも、決して誇張ではなく、正当なユースケースを持っていますか? –

関連する問題