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
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a