2016-04-22 24 views
7

Ciao Sto facendo funzionare un'app del pallone con un database postgreSQL. Ottengo LockErrors quando si usano più lavoratori. Ho imparato che questo è perché la ricerca sibilo blocca il databaseusando BufferedWriter nel pallone whooshalchemy

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

Come spiegato in questo link devo usare BufferedWriter ... I google in giro, ma io davvero non riesco a capire come implementarlo? Qui è la mia messa a punto di database in termini di whoosh

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) 

aiuto è molto apprezzato grazie carl

EDIT: Se non c'è capacità di accesso parallelo nel pallone-whosshsqlalchemy ci sono delle alternative si potrebbe suggerire?

risposta

2

Come si può leggere qui:

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

un solo scrittore può mantenga il blocco. Buffered writer, conserva i tuoi dati per un po ', ma ... ad un certo punto i tuoi oggetti sono memorizzati, e questo significa - blocco.

In base a tale documento, lo scrittore asincrono è qualcosa che si sta cercando, ma ... Ciò proverebbe a memorizzare i dati, se non funziona, creerà thread aggiuntivo e riprovare. Supponiamo che tu stia lanciando 1000 nuovi oggetti. Potenzialmente finirai con qualcosa come 1000 thread. Può essere meglio trattare ogni inserto come un'attività e inviarlo a thread separati. Se ci sono molti processi, è possibile impilarli. Ad esempio: inserisci 10 e attendi. Se quel 10 sono inseriti come una partita, in breve tempo? Lavorerà - per un po '...

Modifica

campione con lettore di asincrona - per far tamponata - semplicemente rinominare importazione, e il loro utilizzo.

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

Ciao Michal, grazie per la risposta. Nel mio caso non ho un grosso carico sul database, ho solo un errore di blocco ogni ora e poi vorrei evitarlo ... le soluzioni standard come BufferedWriter andrebbero completamente bene ... Non riesco proprio a trovare un esempio su come usarlo con il pallone-whoshalchemy – carl

+0

vuol dire che chiosalchemia di fiaschi non fornisce questa funzionalità? – carl

+0

Non so ... ho avuto l'idea di creare qualcosa come la ricerca elastica è per Lucene, forse con interfaccia compatibile :) –