2016-04-22 15 views
7

Hallo ich bin eine Flasche App mit einer PostgreSQL-Datenbank ausgeführt. Ich erhalte LockErrors, wenn mehrere Worker verwendet werden. Ich habe gelernt, dass dies, weil die Zischen Suche in der Datenbankmit BufferedWriter in der Flasche whooshalchemy

http://stackoverflow.com/questions/36632787/postgres-lockerror-how-to-investigate 

Wie in diesem Link Ich habe verwenden BufferedWriter sperrt ... ich um Google, aber ich kann wirklich nicht herausfinden, wie es zu implementieren? Hier ist meine Datenbank-Setup im Hinblick auf Wusch

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) 

Hilfe sehr geschätzt wird dank carl

EDIT: Wenn es keine Möglichkeit für den parallelen Zugriff in Kolben-whosshsqlalchemy gibt es keine Alternativen, die Sie vorschlagen können?

Antwort

2

Wie Sie hier lesen:

http://whoosh.readthedocs.io/en/latest/threads.html

nur ein Schreiber-Sperre halten kann. Gepuffertes Writer, speichert Ihre Daten für einige Zeit, aber ... irgendwann sind Ihre Objekte gespeichert, und das bedeutet - Sperre.

Nach diesem Dokument Async Writer ist etwas, das Sie suchen, aber ... Das würde versuchen, Ihre Daten zu speichern, wenn fehlschlägt - es wird zusätzlichen Thread erstellen, und versuchen Sie es erneut. Nehmen wir an, Sie werfen 1000 neue Gegenstände. Möglicherweise enden Sie mit ungefähr 1000 Threads. Es kann besser sein, jede Einfügung als Aufgabe zu behandeln und sie an einen separaten Thread zu senden. Wenn es viele Prozesse gibt, können Sie diese Aufgaben stapeln. Zum Beispiel - 10 eingeben und warten. Wenn diese 10 als Batch in kurzer Zeit eingefügt werden? Wird arbeiten - für einige Zeit ...

bearbeiten

Probe mit Asynchron-Leser - gepuffert zu machen - einfach importieren und Nutzung umbenennen.

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() 
+0

Hallo Michal danke für Ihre Antwort. In meinem Fall habe ich keine große Last auf der Datenbank, ich bekomme einfach immer einen Sperrfehler und möchte es vermeiden ... die Standardlösungen wie BufferedWriter wären völlig in Ordnung ... Ich kann einfach nicht finden ein beispiel dafür, wie man es mit flaschen-whoshalchemy verwendet – carl

+0

heißt das flash-whooshalchemy bietet diese funktionalität nicht? – carl

+0

Weiß nicht ... Ich hatte eine Idee, etwas wie elastische Suche zu erstellen ist für Lucene, vielleicht mit kompatiblem Interface :) –