2012-03-30 19 views
2

Verwenden von Django für eine kleine App, die Jobs im Hintergrund ausführt (hauptsächlich Cron-Stil, aber auch Benutzer initiiert).
        Haftungsausschluss: dies ist meine erste Begegnung mit celeryd, Setup so weit von Dokumentation und BeispieleTransactionManagementError mit Django Celeryd/Django-Sellerie mit sqlite Backend

Ich verwende Django 1.3, celeryd 2.5, django-Sellerie 2.5.1 und sqlite3.
Ich bin noch in der Testphase, also rufe ich keine echte Aufgabe auf, sondern drucke nur Nachrichten aus.

Ich habe einen cron Stil Aufgabe:

@periodic_task(run_every=crontab(hour="*", minute="*", day_of_week="*")) 
def test(): 
    print "firing test task"

Und eine weitere Aufgabe, die Benutzer initiiert werden:

@task(name="myapp.tasks.user_task") 
def user_task(country): 
    print "performing task for: "+country

Der Cron-Stil Aufgabe wird nur einmal pro Tag ausgeführt werden, während der andere sehr sparsam ausgeführt werden
        (von 0 bis 30'ish mal pro Tag im Durchschnitt)

Ich verwende SQLite als mein Backend und meine Sellerie Einstellungen sind:

# Celery 
INSTALLED_APPS += ("djcelery",) 

import djcelery 
djcelery.setup_loader() 

BROKER_URL = "django://" 
BROKER_POOL_LIMIT = None 
CELERYD_CONCURRENCY = 1

Das Problem, das ich in laufen lasse, was nicht passieren sollte, sondern weil es kann, wird, wenn der Benutzer initiiert Aufgabe user_task wird einige Male in schnellen Folge Sellerie genannt schließt mit dem folgenden unten:

Unrecoverable error: TransactionManagementError('Transaction managed block ended with pending COMMIT/ROLLBACK',)
weiter unten in dem Stapel
TransactionManagementError("Transaction managed block ended with " TransactionManagementError: Transaction managed block ended with pending COMMIT/ROLLBACK

Nach celerd docs, mit Django-Sellerie w/SQLite kann ich nur eine Aufgabe zu einer Zeit verarbeiten, die für meinen Fall perfekt ist, aber scheint wie mehrere Aufgaben aufeinander zu treten.

Ich habe die Parallelitätsebene auf 1 festgelegt, und Pool-Limit auf None, um zu versuchen und helfen, aber ich bekomme immer noch den gleichen Fehler.

Fehle ich hier etwas mit Sellerie? Etwas falsch machen? Gibt es eine bessere Herangehensweise an das, was ich erreichen möchte?

Antwort

Verwandte Themen