Domanda

stackless python non ha preso un buon utilizzo del multi-core, quindi dove è il punto che dovrebbe essere più veloce di pitone filo / multiprocessing?

tutto il punto di riferimento uso stackless pitone tasklet da confrontare con frenafiletti pitone e la coda, che è ingiusto, blocco causa ha sempre bassa efficienza

vedere, se la funzione unico filo uso chiamata senza bloccarlo dovrebbe essere il più efficiente stackless pitone

È stato utile?

Soluzione

Focus su funzionalità di prima, e il secondo le prestazioni (a meno che non sai di avere la necessità).

La maggior parte del tempo su un server è speso con I / O, in modo multi-core non aiutano tanto. Se si tratta di per lo più I / O che si sta lavorando con, multi-threading pitone può essere la risposta più semplice.

Se le richieste del server sono la CPU, quindi avere un processo padre (che si tratti di multi-threaded o meno), e rispettivi processi bambino fa fare un bel po 'di buon senso.

Se davvero si vuole scalare, si poteva guardare una piattaforma diversa, come Erlang. Se davvero si vuole scalare e ancora usare python, si poteva guardare Erlang distribuito con i processi Python gestiti come porte Erlang in un cluster distribuito.

Un sacco di opzioni, ma a meno che non si tratta di un che di grande grande , si potrebbe molto probabilmente un approccio semplice.

liberazione anticipata, il rilascio spesso.

Altri suggerimenti

C'è questa nuova e di tendenza cosa chiamata asincrona-IO-loop e message-passing-concorrenza e pochi altri termini alla moda. Beh, non è affatto nuova, ma è solo a pochi di questi ultimi 5 anni di essere scoperti dal mainstream.

Stackless Python è una versione di Python in cui la VM stesso è stato modificato per supportare al meglio questi messaggi che passa e IO loop, e il suo trucco è verde threading / coroutine.

Non ci sono altre librerie per fare lo stesso con diversi strumenti, per esempio Contorto e Tornado, su Python. È anche possibile eseguire ibrido rilegattura su Stackless Python e così via.

Il bit ciclo IO mappe direttamente a come i socket Berkley fare asincrona IO, e con un po 'di sforzo può essere esteso per essere proattivi piuttosto che reattivo e lavorare con i file system così come socket di rete, per esempio il più recente libevent.

Per scalare lateralmente di utilizzare più di un core è dove si hanno due approcci - multithreading ; stato condiviso esempio filati o tra processi - multiprocessore esempio code di messaggi. È una limitazione generale di architetture attuali che l'approccio thread funziona bene per un gran numero di nuclei localmente, mentre passaggio di messaggi supera prestazioni saggio come il numero di core diventa voluminoso o se tali nuclei sono su macchine diverse. E si può fare un approccio ibrido.

A causa delle scelte progettuali interne nel Python VM, generalmente non è così efficiente in multi-threading come multi-processing, in modo da andare a più processi con un messaggio che passa prima di quanto si potrebbe su altre piattaforme.

Ma in generale il messaggio che passa approccio è un detergente, facilmente corretto di versione.

E ci sono altre lingue che si basano su questo stesso approccio con diversi obiettivi aggiuntivi e vincoli per esempio Erlang, node.js, Clojure, Go.

Di questi, Clojure è forse il più informativo. Quando si capisce come Clojure zecche, e pensare attraverso le whys , l'intero obiettivi e vincoli degli altri sistemi andrà a posto ...

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