Se si desidera imparare come utilizzare thread Perl, c'è buona documentazione in perlthrtut
(threads tutorial) e the threads
pragma manpage. È sicuramente abbastanza buono scrivere degli script semplici.Utilizzare casi per ithreads (thread di interprete) in Perl e motivazione per l'utilizzo o non utilizzo di essi?
Tuttavia, ho trovato poche indicazioni sul web su perché e cosa utilizzare per le discussioni sensibilmente l'interprete di Perl per. In realtà, non si parla molto di loro, e se la gente parla di loro è abbastanza spesso scoraggiare la gente dal usarli.
Questi fili, disponibile quando perl -V:useithreads
è useithreads='define';
e scatenata da use threads
, sono chiamati anche ithreads, e forse più appropriatamente in modo tale che sono molto diversi da discussioni come quelle offerte dai sistemi operativi Linux o Windows o Java VM in che nulla è condiviso per impostazione predefinita e vengono copiati molti dati, non solo lo stack di thread, aumentando così in modo significativo la dimensione del processo. (Per vedere l'effetto, caricare alcuni moduli in uno script di test, quindi creare thread in un ciclo pausa per pressioni di tasti ogni volta, e guardare aumento memoria nel responsabile di operazione o top
.)
[...] ogni volta che si avvia un thread tutte le strutture di dati vengono copiate in la nuova discussione. E quando dico tutto, intendo tutto. Questo ad es. include il pacchetto , variabili globali, lessicali nell'ambito. Qualunque cosa!
- Things you need to know before programming Perl ithreads (Perlmonks 2003)
Quando la ricerca oggetto di ithreads Perl, vedrete persone che scoraggiare dal loro utilizzo ("extremely bad idea", "fundamentally flawed", o "never use ithreads for anything").
The Perl thread tutorial highlights that "Perl Threads Are Different", ma non si preoccupa molto di spiegare come sono diversi e cosa significa per l'utente.
Una spiegazione utile ma molto breve di ciò che realmente sono gli ithread è from the Coro
manpage under the heading WINDOWS PROCESS EMULATION. L'autore di quel modulo (Coro - gli unici thread reali in perl) scoraggia anche l'uso dei thread dell'interprete Perl.
Da qualche parte ho letto che compilando perl con i thread abilitati si otterrà un interprete molto più lento.
C'è una pagina Perlmonks del 2003 (Things you need to know before programming Perl ithreads), in cui l'autore chiede: "Ora ti potresti chiedere perché i ithreads Perl non hanno usato fork()?" Non avrebbe avuto molto più senso? " Questo sembra essere stato scritto dall'autore del pragma forks
. Non sono sicuro che le informazioni fornite su quella pagina siano ancora valide nel 2012 per i nuovi Perls.
Ecco alcune linee guida per l'utilizzo di thread in Perl che ho distillato dalle mie letture (forse erroneamente): così
- Considerare l'utilizzo non-blocking IO invece di fili, come con
HTTP::Async
, oppureAnyEvent::Socket
, orCoro::Socket
. - Considerare l'utilizzo dei fili dell'interprete Perl on Windows only, not on UNIX because on UNIX, forks are more efficient both for memory and execution speed.
- Creare thread all'inizio del programma, non quando la memoria è già considerevole - vedere "ideal way to reduce these costs" in
perlthrtut
. - Ridurre al minimo la comunicazione tra i fili because it's slow (tutte le risposte in quella pagina).
Finora la mia ricerca. Ora, grazie per la luce in più, puoi chiarire questo problema dei thread in Perl. Quali sono alcuni casi d'uso ragionevoli per gli ithreads in Perl? Qual è la motivazione per l'utilizzo o meno del loro utilizzo?
Grazie! Questa è l'istruzione d'uso più dettagliata per i thread di Perl che ho visto fino ad oggi. - Nella mia domanda ho affermato che il * come * dell'uso di ithreads è coperto mentre il * why * e * what for * mancano. Pensando a questo, * come *, * perché * e * che cosa * sono strettamente correlati, e in realtà * come * non è stato sufficientemente accurato (per gli utenti di Perl comuni come me) per rispondere al * perché * e * cosa per *. - Questa risposta è un passo avanti. Grazie ancora. – Lumi
"Sono ancora migliori dei thread di Python." - puoi spiegare questo? Per favore, è molto interessante. – nordicdyno
Principalmente si tratta del GIL Python nella maggior parte delle implementazioni (prevalentemente cpython ma altre meno estensioni). Fondamentalmente, significa che i thread del sistema operativo su Python non possono effettivamente eseguire contemporaneamente il lavoro della CPU, il che ne sconfigge completamente il punto. Puoi usarli (thread Python) per rendere l'I/O un po 'più concorrente, ma è più semplice utilizzare le API orientate agli eventi per farlo. –