[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