2011-01-16 7 views
9

Non ho familiarità con asyncore e ho una conoscenza molto limitata della programmazione asincrona, tranne che per alcune introduzioni introduttive.richiami asyncore che lanciano discussioni ... ok per fare?

Sono più familiare con i thread e li uso in tutte le mie app. Un'app specifica utilizza un database couchdb come interfaccia. Ciò comporta la longpolling del db alla ricerca di modifiche e aggiornamenti. Il modulo che uso per couchdb è couchdbkit. Utilizza un ciclo asyncore per controllare queste modifiche e inviarle a un callback.

Quindi, deduco da questo callback è dove avvio i miei thread di lavoro. Sembra un po 'rozzo mescolare programmazione asincrona e thread. Mi piace molto couchdbkit, ma preferisco non introdurre problemi nel mio programma.

Quindi, la mia domanda è, è sicuro sparare thread da un callback asincrono?

Ecco po 'di codice ...

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. 

Aggiornamento:

Dopo aver guardato su questo di più, ho una domanda aggiuntiva per i guru couchdbkit. Ci saranno potenzialmente centinaia di thread usando il database. Come puoi vedere nel mio esempio di codice, sto creando un'istanza di un oggetto couchdbkit.Database per thread. Penso che questo possa essere uno spreco. Quindi, va bene per un singolo oggetto di database essere usato globalmente tra i thread?

risposta

3

Non creerebbe un nuovo thread ogni volta che il server restituisce un nuovo documento? Direi che è meglio creare un pool di thread di lavoro prima di, si chiama qualsiasi cosa sul server e basta aggiungere un lavoro alla coda che questi thread stanno leggendo il proprio lavoro nel metodo dispatch.

Ma non c'è motivo per cui il mixaggio di threading e programmazione asincrona debba essere considerato pericoloso.

+0

Yea creare un nuovo thread per ordine di lavoro è l'idea. Ogni lavoratore aprirà un tunnel ed eseguirà varie attività di manutenzione su un dispositivo remoto. Non ho considerato un pool di thread, ma forse visto come vengono utilizzati i callback, questa potrebbe essere una buona idea. Grazie per l'input. – sbartell