Использование BufferedWriter в колбе
Привет я запускаю приложение фляги с базой данных postgreSQL. Я получаю LockErrors при использовании нескольких рабочих. Я узнал, что это потому, что поиск свиста блокирует базу данных
http://stackru.com/questions/36632787/postgres-lockerror-how-to-investigate
Как объяснено в этой ссылке, я должен использовать BufferedWriter... Я гуглю, но не могу понять, как это реализовать? Вот моя база данных с точки зрения свист
import sys
if sys.version_info >= (3, 0):
enable_search = False
else:
enable_search = True
import flask.ext.whooshalchemy as whooshalchemy
class User(db.Model):
__searchable__ = ['username','email','position','institute','id'] # these fields will be indexed by whoosh
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100), index=True)
...
def __repr__(self):
return '<User %r>' % (self.username)
if enable_search:
whooshalchemy.whoosh_index(app, User)
помощь очень ценится благодаря Карл
РЕДАКТИРОВАТЬ: Если нет возможности параллельного доступа в колбу-whosshsqlalchemy, есть ли какие-либо альтернативы, которые вы могли бы предложить?
1 ответ
Как вы можете прочитать здесь:
http://whoosh.readthedocs.io/en/latest/threads.html
Только один писатель может удерживать замок. Буферный писатель хранит ваши данные некоторое время, но... в какой-то момент ваши объекты сохраняются, а это значит - блокировка.
Согласно этому документу, асинхронный писатель - это то, что вы ищете, но... Он попытается сохранить ваши данные, если произойдет сбой - он создаст дополнительный поток и повторите попытку. Предположим, вы бросаете 1000 новых предметов. Потенциально у вас получится что-то вроде 1000 потоков. Лучше рассматривать каждую вставку как задачу и отправлять ее в отдельный поток. Если есть много процессов, вы можете сложить эти задачи. Например, введите 10 и подождите. Если эти 10 будут вставлены в виде партии, в короткие сроки? Будет работать - какое-то время...
редактировать
Пример с асинхронным ридером - чтобы сделать буферизованным - просто переименуйте импорт и использование.
import os, os.path
from whoosh import index
from whoosh.fields import SchemaClass, TEXT, KEYWORD, ID
if not os.path.exists("data"):
os.mkdir("data")
# http://whoosh.readthedocs.io/en/latest/schema.html
class MySchema(SchemaClass):
path = ID(stored=True)
title = TEXT(stored=True)
icon = TEXT
content = TEXT(stored=True)
tags = KEYWORD
# http://whoosh.readthedocs.io/en/latest/indexing.html
ix = index.create_in("data", MySchema, indexname="myindex")
writer = ix.writer()
writer.add_document(title=u"My document", content=u"This is my document!",
path=u"/a", tags=u"first short", icon=u"/icons/star.png")
writer.add_document(title=u"Second try", content=u"This is the second example.",
path=u"/b", tags=u"second short", icon=u"/icons/sheep.png")
writer.add_document(title=u"Third time's the charm", content=u"Examples are many.",
path=u"/c", tags=u"short", icon=u"/icons/book.png")
writer.commit()
# needed to release lock
ix.close()
#http://whoosh.readthedocs.io/en/latest/api/writing.html#whoosh.writing.AsyncWriter
from whoosh.writing import AsyncWriter
ix = index.open_dir("data", indexname="myindex")
writer = AsyncWriter(ix)
writer.add_document(title=u"My document no 4", content=u"This is my document!",
path=u"/a", tags=u"four short", icon=u"/icons/star.png")
writer.add_document(title=u"5th try", content=u"This is the second example.",
path=u"/b", tags=u"5 short", icon=u"/icons/sheep.png")
writer.add_document(title=u"Number six is coming", content=u"Examples are many.",
path=u"/c", tags=u"short", icon=u"/icons/book.png")
writer.commit()