[Python] Deploy con nginx e proxy_pass
Manlio Perillo
manlio.perillo a gmail.com
Ven 3 Gen 2014 20:34:47 CET
On 03/01/2014 18:43, Roberto De Ioris wrote:
> [...]
>> Io su soluzioni come gevent o microthread ho sempre questi due dubbi:
>>
>> 1) Usano il modello sincrono, "nascondendo" le azioni asincrone.
>> Questo per molti è un vantaggio, ma a me non piacciono i pattern che
>> ti nascondono le cose (specialmente se importanti).
>> Inoltre, in linguaggi come go, non hai nessun controllo sul runtime
>> e quindi non puoi ottimizzare l'esecuzione delle goroutine in
>> eventuali casi particolari.
>
> ti do ragione (soprattutto su go, perche' un linguaggio venduto come
> 'linguaggio di sistema' mi deve permettere di fare porcherie :P).
>
> Quindi tu preferisci al:
>
> def mio_magico_thread(Greenlet):
> connect(address)
> send blah blah
>
> un (linguaggio inventato):
>
> fd = async_connect(address)
> wait_for_write(fd)
> suspend()
> # sono qui solo quando fd e' pronto
> if fd.ready():
> send blah blah
>
Quello che preferisco io è un linguaggio che mi permetta di creare i
singoli blocchi, come voglio io e nel modo più efficiente che voglio.
Inoltre voglio librerie che implementano i vari protocolli di rete a
basso livello, e nel modo più efficiente possibile (quindi macchina a
stato) e che facciano solo quello e bene.
Come ho scritto, il mio esempio di riferimento è la libpq (solo che io
sono più radicale e toglierei, se possibile, tutto l'I/O usando solo
buffer che l'utente deve riempire/svuotare).
>>
>> 2) Efficienza.
>> Che succede se in un processo Python con gevent stai gestendo un
>> migliaio di threads? Quanta memoria stai usando?
>>
>> Soluzioni come gevent, goroutine e soci tendono ad usare moltissima
>> memoria virtuale, che potrebbe facilmente risultare in una
>> degradazione delle performance, a causa dello swapping.
>
> beh la swap la puoi disabilitare, comunque le greenlet consumano un bel
> po' di memoria (meno di un thread python comunque) ma su un sistema con
> 32G di ram ce ne fai girare almeno 200k quindi piu' che sufficiente a
> gestire le connessioni che puoi fare su un singolo ip.
>
Io sono di parte, perchè il mio vecchio laptop ha 2GB di memoria, e mi
da fastidio quando vedo software che usano la memoria in modo allegro.
> Con gevent non e' la ram il problema, e' che e' poco efficiente nella
> parte syscall in quanto per facilitare la vita allo sviluppatore, cancella
> e ri-registra i file descriptor ad ogni giro. Dopo qualche migliaio di
> greenlet in funzione il carico di sistema schizza di brutto.
>
Facilitare la vita al programmatore "casuale" ed efficienza non sembra
vadano molto d'accordo.
> C'e' poi da dire che gestire tali moli di concorrenza richiede un tuning
> di tutta la macchina e (soprattutto) dei servizi come i database che
> devono essere pronti a gestire centiaia di query in blocco.
>
Sicuramente.
Aggiungerei che c'è anche bisogno di un tuning del cervello dei
programmatori che si trovano a sviluppare software di questo tipo ;).
Ciao Manlio
Maggiori informazioni sulla lista
Python