2011-08-16 6 views
12

Ad esempio, se creo un iteratore utilizzando chain, posso chiamarlo su più thread? Si noti che la sicurezza del thread basata su GIL è accettabile, ma non preferibile.Isertools è thread-safe?

(Si noti che questo è leggermente diverso da this question, che riguarda generatori, non iteratori scritti in C).

risposta

11

In primo luogo, nulla nel official documentation on itertools dice che sono thread-safe. Quindi sembra che la specifica Python non garantisca nulla a riguardo. Questo potrebbe essere diverso tra implementazioni come Jython o PyPy, ma questo significa che il tuo codice probabilmente non sarà portatile.

In secondo luogo, la maggior parte itertools (con l'eccezione di quelli semplici, come count) accettano altri iteratori come input. Avresti bisogno che questi iteratori si comportino correttamente anche in modalità thread-safe.

In terzo luogo, alcuni iteratori potrebbero non avere senso se utilizzati contemporaneamente da thread diversi. Ad esempio, izip che lavora in più thread potrebbe entrare in condizioni di competizione prendendo elementi da più fonti, specialmente come definito da un codice python equivalente (cosa succederà quando un thread riuscirà a prendere valore da un solo iteratore di input, quindi il secondo thread da due di essi ?).

Si noti inoltre che la documentazione non dice che itertools sono implementate in C. Sappiamo (come un dettaglio di implementazione), che di CPython itertools sono effettivamente scritti in C, ma su altre implementazioni che possono tranquillamente essere implementate come generatori, e si può tornare allo question you cited.

Quindi, no, non si può presumere che siano thread-safe a meno che non si conoscano i dettagli di implementazione della piattaforma Python di destinazione.