Sono un po 'confuso sul fatto che il multithreading funzioni o meno in Python.
So che ci sono state molte domande su questo e ne ho lette molte, ma sono ancora confuso. So per esperienza personale e ho visto altri pubblicare le proprie risposte ed esempi qui su StackOverflow che il multithreading è effettivamente possibile in Python. Allora perché tutti continuano a dire che Python è bloccato dal GIL e che può essere eseguito un solo thread alla volta? Chiaramente funziona. O c'è qualche distinzione che non sto ottenendo qui?
Molti poster / intervistati continuano a menzionare che il threading è limitato perché non fa uso di più core. Ma direi che sono ancora utili perché funzionano contemporaneamente e quindi ottengono il carico di lavoro combinato più velocemente. Voglio dire, perché altrimenti ci sarebbe anche un modulo thread Python?
Aggiornare:
Grazie per tutte le risposte finora. Il modo in cui capisco è che il multithreading verrà eseguito in parallelo solo per alcune attività di I / O, ma può essere eseguito solo uno alla volta per più attività core legate alla CPU.
Non sono del tutto sicuro di cosa significhi per me in termini pratici, quindi fornirò solo un esempio del tipo di attività che vorrei eseguire in multithread. Ad esempio, diciamo che voglio scorrere un elenco molto lungo di stringhe e voglio eseguire alcune operazioni di base sulle stringhe su ogni elemento dell'elenco. Se divido l'elenco, invio ogni sottolista affinché venga elaborata dal mio codice di loop / stringa in un nuovo thread e rimando i risultati in una coda, questi carichi di lavoro verranno eseguiti più o meno allo stesso tempo? Ancora più importante, questo teoricamente accelererà il tempo necessario per eseguire lo script?
Un altro esempio potrebbe essere se posso eseguire il rendering e salvare quattro immagini diverse utilizzando PIL in quattro thread diversi, e fare in modo che questo sia più veloce dell'elaborazione delle immagini una dopo l'altra? Immagino che questo componente della velocità sia ciò su cui mi sto davvero chiedendo piuttosto che qual è la terminologia corretta.
Conosco anche il modulo multiprocessing, ma il mio interesse principale in questo momento è per i carichi di attività medio-piccole (10-30 secondi) e quindi penso che il multithreading sarà più appropriato perché i sottoprocessi possono essere lenti da avviare.