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()
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
vuol dire che chiosalchemia di fiaschi non fornisce questa funzionalità? – carl
Non so ... ho avuto l'idea di creare qualcosa come la ricerca elastica è per Lucene, forse con interfaccia compatibile :) –