我试图用多函数运行我的代码,但蒙戈回头率管理Python的多处理的MongoDB
“MongoClient叉之前打开。与 连接=假创建MongoClient,或分叉后创建客户。 “
我真的不明白我可以如何适应我的代码。 基本上结构是:
db = MongoClient().database
db.authenticate('user', 'password', mechanism='SCRAM-SHA-1')
collectionW = db['words']
collectionT = db['sinMemo']
collectionL = db['sinLogic']
def findW(word):
rows = collectionw.find({"word": word})
ind = 0
for row in rows:
ind += 1
id = row["_id"]
if ind == 0:
a = ind
else:
a = id
return a
def trainAI(stri):
...
if findW(word) == 0:
_id = db['words'].insert(
{"_id": getNextSequence(db.counters, "nodeid"), "word": word})
story = _id
else:
story = findW(word)
...
def train(index):
# searching progress
progFile = "./train/progress{0}.txt".format(index)
trainFile = "./train/small_file_{0}".format(index)
if os.path.exists(progFile):
f = open(progFile, "r")
ind = f.read().strip()
if ind != "":
pprint(ind)
i = int(ind)
else:
pprint("No progress saved or progress lost!")
i = 0
f.close()
else:
i = 0
#get the number of line of the file
rangeC = rawbigcount(trainFile)
#fix unicode
non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), 0xfffd)
files = io.open(trainFile, "r", encoding="utf8")
str1 = ""
str2 = ""
filex = open(progFile, "w")
with progressbar.ProgressBar(max_value=rangeC) as bar:
for line in files:
line = line.replace("\n", "")
if i % 2 == 0:
str1 = line.translate(non_bmp_map)
else:
str2 = line.translate(non_bmp_map)
bar.update(i)
trainAI(str1 + " " + str2)
filex.seek(0)
filex.truncate()
filex.write(str(i))
i += 1
#multiprocessing function
maxProcess = 3
def f(l, i):
l.acquire()
train(i + 1)
l.release()
if __name__ == '__main__':
lock = Lock()
for num in range(maxProcess):
pprint("start " + str(num))
Process(target=f, args=(lock, num)).start()
此代码,用于读取在4个不同过程4不同的文件,并在同一时间在数据库中插入数据制成。 我只复制了一部分代码,以使您了解它的结构。
我试图添加连接=假这段代码,但没有...
db = MongoClient(connect=False).database
db.authenticate('user', 'password', mechanism='SCRAM-SHA-1')
collectionW = db['words']
collectionT = db['sinMemo']
collectionL = db['sinLogic']
然后我试着将它移动的F功能(右车前(),但我得到什么在该程序没有找到collectionW,collectionT和collectionL。
我不是蟒蛇很内行或MongoDB的,所以我希望这不是一个愚蠢的问题。
的代码的Ubuntu 16.04下运行.2用python 2.7.12
这不完全是一个新话题,因为数据库连接的“线程安全性”的一般概念已经存在很长时间了。可能为什么错误信息如此描述和准确。你被告知只在你fork后建立一个连接**,所以连接只能在工作进程中**。如果你想要某种类型的** IPC **,那么你可以使用别的方法来做到这一点。但是在进程/线程之间复制的数据库句柄是“正确的”,并且已经持续了很长时间。 –