2011-01-16 19 views
9

No estoy familiarizado con asyncore, y tengo un conocimiento muy limitado de la programación asincrónica excepto por algunas introducciones a tutoriales retorcidos.callbacks asyncore lanzando hilos ... ¿está bien?

Estoy muy familiarizado con los hilos y los uso en todas mis aplicaciones. Una aplicación en particular utiliza una base de datos couchdb como su interfaz. Esto involucra longpolling el DB buscando cambios y actualizaciones. El módulo que uso para couchdb es couchdbkit. Utiliza un ciclo asyncore para observar estos cambios y enviarlos a una devolución de llamada.

Por lo tanto, me imagino a partir de esta devolución de llamada es donde puedo iniciar mis hilos de trabajo. Parece un poco crudo mezclar programación asíncrona y roscada. Realmente me gusta couchdbkit, pero preferiría no introducir problemas en mi programa.

Entonces, mi pregunta es, ¿es seguro disparar hilos desde una devolución de llamada asíncrona?

Aquí hay algo de código ...

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. 

Actualización:

Después de mirar sobre esto más, tengo una pregunta adicional para los gurús couchdbkit. Es posible que haya cientos de hilos utilizando la base de datos. Como puede ver en mi ejemplo de código, estoy instanciando un objeto couchdbkit.Database por hilo. Creo que esto puede ser un desperdicio. Entonces, ¿está bien que un único objeto de base de datos se use globalmente entre los hilos?

Respuesta

3

¿No crearía esto un nuevo hilo cada vez que el servidor devuelva un nuevo documento? Supongo que es mejor crear un grupo de subprocesos de trabajo antes de llamar a algo en el servidor, y simplemente agregar un trabajo a la cola que estos subprocesos están leyendo su trabajo en el método dispatch.

Pero no hay ninguna razón por la cual el mezclado de subprocesos y la programación asíncrona se consideren peligrosos.

+0

Sí, la idea es crear un nuevo hilo por orden de trabajo. Cada trabajador abrirá un túnel y realizará varias tareas de mantenimiento en un dispositivo remoto. No he considerado un grupo de subprocesos, pero tal vez dado cómo se utilizan las retrollamadas esto puede ser una buena idea. Gracias por la entrada. – sbartell

Cuestiones relacionadas