2014-12-17 15 views
6

Sto provando asyncio e devo mescolarlo con un normale codice di blocco multi-thread, quindi ho bisogno di scaricare l'esecuzione usando run_in_exector.Il loop.run_in_executor di asyncio è thread-safe?

asyncio docs warn that "most functions" aren't threadsafe e che call_soon_threadsafe è l'unica funzione thread-safe. Ce ne sono altri ancora, come Future.add_done_callback, che sono documentati esplicitamente come thread-safe. Poi ha una frase in seguito che dice "puoi usare run_in_executor per eseguire callback in altri thread", ma non commenta specificamente la sicurezza del thread.

run_in_executor non è doc per essere thread-safe, ma guardando la fonte, sembra che sia thread-safe se vengono presi i giusti percorsi di codice.

Qualcuno sa se è supposto essere thread sicuro, ma non è documentato per essere in quel modo?

+0

Che cosa si intende per "thread-safe" in questo contesto? La documentazione usa quel termine per indicare se è sicuro chiamare un dato metodo da un thread esterno a quello che esegue il ciclo di eventi 'asyncio'. Probabilmente non è quello che stai chiedendo qui, però, vero? – dano

+0

Questo è esattamente quello che intendevo. Ho un codice multi thread già esistente e sto cercando di usare asyncio con esso, quindi ho bisogno di un modo thread-safe per programmare il codice di blocco. –

risposta

4

run_in_executor si suppone essere non threadsafe da specifica (scusate, sembra dichiarazione implicita e, probabilmente, dovrebbe essere chiarito in PEP-3156).

Anche se l'implementazione concreta è sicura per il thread, non si presupponga che qualsiasi implementazione conforme a PEP-3156 sia anche thread-safe.

+2

Il modo corretto per rendere sicuro (o qualcosa) thread thread è quello di racchiuderlo in call_soon_threadsafe: 'loop.call_soon_threadsafe (loop.run_in_executor, executor, callback, * args))' – Lucretiel

2

Penso che dipenda interamente da ciò che gli dai. In pratica, si avvia appena un thread e si esegue il codice, quindi se tale thread è sicuro o meno dipende da ciò che gli si dice di fare.

2

L'implementazione predefinita sembra protetta dai thread se il parametro executor non è None o l'executor predefinito è già impostato (richiamo loop.set_default_executor()). Altrimenti, possono essere creati due esecutori.

Si può scrivere una patch per rendere il metodo thread-safe ;-)