[Python] Deploy con nginx e proxy_pass

Roberto De Ioris roberto a unbit.it
Ven 3 Gen 2014 18:43:01 CET


> On 03/01/2014 18:09, Roberto De Ioris wrote:
>> [...]
>>
>> Python e' utilizzabilissimo, e' solo che devi essere "consapevole"
>> (stessa
>> cosa in ruby o in perl), poiche' ci sono diversi framework per la
>> programmazione asincrona e devi sceglierne uno (io consiglio sempre
>> gevent, ma dopo averlo studiato, non perche' sia migliore tecnicamente
>> ma
>> perche' e' quello con la base di utilizzatori e librerie piu' ampia e
>> mantenuta di questi tempi [e poi io do' sempre valore aggiunto ai
>> progetti
>> in cui il core developer non e' un "asshole"]).
>>
>> la differenza con node, erlang, go (e rust e tanti altri) e' che il
>> framework asincrono e' direttamente parte del core cosi' come le
>> primitive
>> per i microthread. L'utente non deve preoccuparsi (piu' o meno) che
>> qualche operazione sia bloccante.
>>
>
> 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

>
> 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.

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.

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.


-- 
Roberto De Ioris
http://unbit.it


Maggiori informazioni sulla lista Python