Domanda

Ho scritto una bella scrittura multithread, e quando mi sono imbattuto, è eseguito peggio con 25 fili che con invocazione solo diretta del gestore thread.

Poi ho scoperto il blocco interprete globale. Vorrei chiedere, prima di scartare Python per questo script e riscrivere la cosa in qualcosa d'altro, non v'è alcun modo per fare lavoro effettivo multithreading in Python?

È stato utile?

Soluzione

L'altro approccio è quello di abbandonare fili e utilizza un Multiprocessing modulo (Python 2.6 +), che ottiene intorno alla GIL, ed ha un'API che di almeno simile a quello del modulo threading.

Altri suggerimenti

Ora, questa è una domanda interessante -. Non credo che ci sia una fuga della GIL nel CPython dritto

Stackless Python si suppone abbia migliorato le prestazioni "concorrenza" nel corso CPython con il suo uso di microspire , ma ho dont't pensano che sfugge alla GIL.

In aggiunta, secondo il GIL su python.org , Jython e IronPython non lo fanno avere un GIL.

La risposta corretta dipende molto da quello che stai facendo.

fortemente CPU-bound (e il blocco IO-bound) compiti, come la compressione e rendering delle immagini, si realizza con il codice nativo, e le librerie native normalmente rilasciare il GIL mentre lavorano, che permette la concorrenza. Quando si può isolare il lavoro intensivo della CPU a una chiamata nativa stretto, si ottiene la concorrenza, prestazioni native dove conta, e la comodità di scrittura maggior parte del codice in Python.

Non tutto il codice è fare quelle piccole, blocchi isolabili di codice di calcolo che possono essere implementate ordinatamente in una libreria nativa, ma un bel po '.

Nel CPython (l'implementazione di Python in C), no, secondo la mia conoscenza. (Se mi sbaglio, per favore correggetemi, sarei sicuro che piacerebbe sapere se esiste una soluzione!).

Si potrebbe desiderare di essere interessato a IronPython (NET) o JPython (Java / JWM). Io non li ho usato, ma credo che almeno uno di essi supporta thread nativi del dato ambiente di esecuzione.

Si potrebbe provare il multiprocessing modulo, se è applicabile al vostro problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top