2015-09-19 4 views
0

По прошествии некоторого времени, глядя на документацию mongodb и API pymongo, я все еще не понимаю, какой маршрут я использую в качестве пути вперед (более смущенный теперь, когда я начал). Моя проблема касается блокировок ... не так много, что я протестировал и нашел там серьезные проблемы с параллелизмом, но я не хочу натыкаться на них после факта.Предотвращение блокировки Mongodb

У меня есть скрипт tkinter с несколькими функциями, все они нуждаются в доступе к одной коллекции документов, и большинство из них обращаются к одному и тому же документу внутри этой коллекции.

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'] 

И называется подпроцесс (в отдельных сценариях), несколько экземпляров возможных:

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

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

Таким образом, было бы достаточно в этом случае просто использовать client.close() в каждой функции?

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

Аналогично в то время как петли:

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

, что хватит, или я должен смотреть, чтобы шард в этом случае? Или я просто вернусь к SQL!

Mongodb 3.0.6 32-bit, pymongo 3.03, python 2.7.

+1

Ваша собственная цитата * «не так много, что я проверил и нашел там серьезные проблемы с параллелизмом» * должен привести вас к выводу, который проявляется в этой знаменитой цитате. * «Преждевременная оптимизация - это корень всех злых (или, по крайней мере, большей части) в компьютерном программировании» *. Который достаточно, чтобы точно сказать, что вы здесь делаете. Во что бы то ни стало «тест, тест, а затем снова тест», где вы находите проблемы, затем разбирайте их соответствующим образом или попросите таких же, как мы, для решения этих проблем. Однако ни при каких обстоятельствах не следует закрывать соединение с базой данных до завершения полностью. –

+0

И это означает, что ваше приложение будет завершено. Соединения с базой данных - дорогостоящие операции. Держите их открытыми, пока приложение не будет полностью выполнено. –

+0

@Blakes Seven Duly отметил, хорошая цитата, очень уместна и в этом случае, время, которое я потратил впустую, пытаясь спланировать это, теперь проходит через несколько дней. Просто пытаясь быть осторожным, когда я действительно должен быть скорее пиратом. Приветствия. – ajsp

ответ

0

Насколько избежать блокировки в этом случае я ставлю клиента в отдельный скрипт, foo.py:

import pymongo 

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

А затем импортировать коллекцию в любом месте я нуждался в течение различных сценариев:

from foo import COLLEC 
Смежные вопросы