2011-01-16 5 views
9

Ich bin nicht vertraut mit asyncore, und habe sehr begrenzte Kenntnisse der asynchronen Programmierung mit Ausnahme einiger Intro zu verdrehten Tutorials.asyncore Callbacks starten Threads ... ok zu tun?

Ich kenne Threads am besten und verwende sie in allen meinen Apps. Eine bestimmte App verwendet eine couchdb Datenbank als Schnittstelle. Dies beinhaltet das Longpolling der db auf der Suche nach Änderungen und Updates. 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.

Also, ich denke, von diesem Callback ist, wo ich meine Worker-Threads starten. Es scheint ein bisschen primitiv zu sein, asynchrone und threaded Programmierung zu mischen. Ich mag couchdbkit wirklich, würde aber keine Probleme in mein Programm einführen.

Meine Frage ist also, ist es sicher, Threads von einem Async-Callback 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. 

Update:

Nach über diese mehr suchen, ich habe eine weitere Frage für den couchdbkit Gurus. Es wird möglicherweise Hunderte von Threads mit der Datenbank geben. Wie Sie in meinem Codebeispiel sehen können, instanziiere ich ein couchdbkit.Database-Objekt pro Thread. Ich denke, das könnte verschwenderisch sein. Also, ist es in Ordnung, wenn ein einzelnes Datenbankobjekt global unter den Threads verwendet wird?

Antwort

3

Würde dies nicht jedes Mal einen neuen Thread erstellen, wenn der Server ein neues Dokument zurückgibt? Ich würde vermuten, dass Sie am besten einen Pool von Worker-Threads erstellen vor Sie alles auf dem Server aufrufen, und fügen Sie einfach einen Job in die Warteschlange, die diese Threads ihre Arbeit aus der dispatch-Methode lesen.

Aber es gibt keinen Grund, warum Mischen Threading und asynchrone Programmierung als gefährlich angesehen werden sollte.

+0

Yea Erstellen eines neuen Threads pro Arbeitsauftrag ist die Idee. Jeder Mitarbeiter öffnet einen Tunnel und führt verschiedene Wartungsaufgaben auf einem Remote-Gerät aus. Ich habe nicht einen Thread-Pool in Betracht gezogen, aber vielleicht gegeben, wie Rückrufe verwendet werden, ist dies eine gute Idee. Danke für die Eingabe. – sbartell

Verwandte Themen