2015-09-19 5 views
0

Après un certain temps à regarder la documentation mongodb et l'API pymongo, je ne suis toujours pas plus clair sur la route que je prends comme voie à suivre (plus confus maintenant que quand j'ai commencé). Mon problème concerne les verrous ... pas tellement que j'ai testé et constaté qu'il y a des problèmes majeurs de simultanéité, mais que je ne veux pas les rencontrer après coup.Mongodb lock prevention

J'ai un script tkinter avec plusieurs fonctions, tous ont besoin d'accéder à la même collection de documents, et la plupart d'entre eux accèdent au même document dans cette collection.

client = MongoClient() 

def 1(): 
    glob_client = client['ALPHA']['A-Z'] 
    #do work: 
    """Also call subprocesses that use the same database document (glob_client) in another script. 
    There can be 3 -10 instances of this subprocess running, listening to various http streams in a while loop, 
    collecting data that can come in at 100's of times per second.""" 

def2(): 
    glob_client = client['ALPHA']['A-Z'] 
... 
def32(): 
    glob_client = client['ALPHA']['A-Z'] 

Et le sous-processus appelé (dans les scripts séparés), plusieurs instances possibles:

client = MongoClient() 
glob_client = client['ALPHA']['A-Z'] 

while True: 
    #do work with glob_client; updates, push, pull, reads, 

Alors, serait-il suffisant dans ce cas d'utiliser juste client.close() dans toutes les fonctions?

def 1(): 
    glob_client = client['ALPHA']['A-Z'] 
    #do work 
    client.close() 

De même dans les boucles while:

while True: 
    #do work with glob_client; updates, push, pull, reads, 
    Client.close() 

Est-ce que cela vous suffise, ou devrais-je être à la recherche Shard dans ce cas? Ou devrais-je juste revenir à SQL!

Mongodb 3.0.6 32 bits, pymongo 3.03, python 2.7.

+1

Votre propre citation * "pas tellement que j'ai testé et trouvé qu'il y ait des problèmes de concurrence majeurs" * devrait vous mener à une conclusion qui est évidente dans cette célèbre citation. * "L'optimisation prématurée est la racine de tout mal (ou du moins de la plus grande partie) dans la programmation informatique" *. Ce qui est suffisant pour dire exactement ce que vous faites ici. Par tous les moyens, «testez, testez, puis testez à nouveau», où vous trouvez des problèmes, puis traitez-les de la manière appropriée, ou demandez à des pairs comme nous de trouver des solutions à ces problèmes. En aucun cas, cependant, vous devez fermer une connexion à la base de données jusqu'à ce que complètement. –

+0

Et cela signifie que votre application est terminée en cours d'exécution. Les connexions de base de données sont des opérations coûteuses. Gardez-les ouverts jusqu'à ce que l'application soit complètement terminée. –

+0

@Blakes Seven Dûment noté, bonne citation, très approprié dans ce cas aussi, le temps que j'ai gaspillé en essayant de planifier cela se déroule maintenant en plusieurs jours. J'essaie juste d'être prudent, alors que je devrais être plus un boucanier. À votre santé. – ajsp

Répondre

0

En ce qui évite un blocage dans ce cas, je mets le client dans un script séparé, foo.py:

import pymongo 

CLIENT = pymongo.MongoClient(maxPoolSize=None,w=1) 
COLLEC = CLIENT ['ABC']['XYZ'] 

Et puis importé la collection partout où je avais besoin dans divers scripts:

from foo import COLLEC