Frage

Ich bin nicht vertraut Asyncore, und haben nur sehr begrenzte Kenntnisse über asynchrone Programmierungen, mit Ausnahme einiger Intro -to -Tutorials.

Ich bin am besten mit Threads vertraut und benutze sie in allen meinen Apps. Eine bestimmte App verwendet a Couchdb Datenbank als Schnittstelle. Dies beinhaltet die Langzeit des DB, der nach Änderungen und Aktualisierungen sucht. Das Modul, das ich für CouchDB verwende, ist Couchdbkit. Es verwendet eine Asyncore -Schleife, um diese Änderungen zu beobachten und sie an einen Rückruf zu senden.

Ich denke also, dass ich aus diesem Rückruf meine Arbeiterfäden starte. Es scheint ein bisschen grob zu sein, asynchrone und fadengestützte Programmierung zu mischen. Ich mag Couchdbkit sehr, möchte aber lieber Probleme in mein Programm einführen.

Meine Frage ist also, ist es sicher, Fäden aus einem asynchronen Rückruf zu feuern?

Hier ist ein Code ...

def dispatch(change):
    global jobs, db_url # jobs is my queue
    db = Database(db_url)
    work_order = db.get(change['id']) # change is an id to the document that changed. 
                                  # i need to get the actual document (workorder)

    worker = Worker(work_order, db) # fire the thread
    jobs.append(worker)
    worker.start()
    return


main()
.
.
.

consumer.wait(cb=dispatch, since=update_seq, timeout=10000) #wait constains the asyncloop.

Aktualisieren:

Nachdem ich mir mehr übergesehen habe, habe ich eine zusätzliche Frage für den CouchDBKit -Gurus. Es wird möglicherweise Hunderte von Threads mit der Datenbank geben. Wie Sie in meinem Code -Beispiel sehen können, instanziiere ich ein CouchDBKit.Database -Objekt pro Thread. Ich denke, das mag verschwenderisch sein. Ist es also in Ordnung, dass ein einzelnes Datenbankobjekt unter den Threads global verwendet wird?

War es hilfreich?

Lösung

Würde dies nicht jedes Mal, wenn der Server ein neues Dokument zurückgibt, einen neuen Thread erstellen? Ich würde vermuten, dass Sie am besten einen Pool von Arbeiterfäden erstellen Vor Sie rufen irgendetwas auf dem Server an und fügen der Warteschlange, aus denen diese Threads ihre Arbeiten lesen, einen Job hinzu. dispatch Methode.

Es gibt jedoch keinen Grund, warum das Mischen von Fäden und asynchrones Programmieren als gefährlich angesehen werden sollte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top