2017-11-03 8 views
0

Kürzlich zu erhöhen, habe ich verwendet, Kolben-rq mit Kolben-sqlalchemy einig Asynchron-Aufgabe mit dem Modell-Operationen zu tun. Während es gelegentlich den Fehler beim Aufrufen von Model-Methoden ausgelöst. Ich weiß nicht, was mit meinem Mitarbeiter passiert, um das Problem zu verursachen. Ich konnte das Problem nicht korrekt reproduzieren. Hier sind Schnipsel.Mit Kolben-rq mit Kolben-sqlalchemy gelegentlich ResourceClosedError

worker.py

if __name__ == '__main__': 
    with app.app_context(): 
     QUEUE = get_queue() 
     worker = get_worker() 
     worker.push_exc_handler(retry_handler) 
     worker.work() 

tasks.py (die einige Async-Aufgaben enthält)

@job 
def async_restart_task(task_id): 
    creating_info = {"status": TaskStatus.Creating} 
    task = TaskModel.update_task(task_id, creating_info) 

    task = TaskModel.get_task_by_id(task_id) 
    service = get_service(task.service) 

    for jobs in iter_group(10, service.gen_jobs(task)): 
     JobModel.add_jobs(jobs) 

der Asynchron Aufgabe gelegentlich erhöhen ResourceClosedError

ResourceClosedError: This result object does not return rows. It has been closed automatically.

Ich habe keine Ahnung, wie ich das Problem beheben kann, indem ich einer guten Übung folge. Ich habe lange gesucht und habe dasselbe Problem bekommen. Ref: Celery and SQLAlchemy - This result object does not return rows. It has been closed automatically

Gibt es irgendwelche guten Vorschläge oder Beispiele für diese Fälle, indem Sie sqlalchemy in einer async-Aufgabe verwenden?

Antwort

0

Ich habe eine gute Zusammenfassung und Vorschläge, die von the same question auf die Verwendung von sqlalchemy in der multi-processes Anwendungsfall kommt mag meine Codes mit Kolben-rq. Danke an @zzzeek, ​​der Autor von sqlalchemy hat mir eine gute Erklärung für das Problem gegeben.

Es sagt uns, dass, wenn sqlalchemy Verwendung von Verbindung zwischen mehreren Prozessen oder Arbeiter teilen leicht diese Klasse Problem auftreten würde. Wir sollten besser ein neues engine instanziieren, um die Arbeit auf dem anderen Prozess wie einem gegabelten Kindprozess auszuführen.

Also, wenn Async-Warteschlange wie celery oder RQ und alle anderen Warteschlangen mit dem Sqlalchemy verwenden. Es ist besser, von der ursprünglichen Job oder Task Klasse zu erben, um ein neues engine oder einzurichten, um dieses Problem zu beheben. Von diesem same issue

Schließlich. Sie können einige Ratschläge oder Hinweise von @zzzeek befolgen, siehe sqlalchemy FAQ

Verwandte Themen