[Python] Non blocking http server e integrazione con database relazionali

Manlio Perillo manlio.perillo a gmail.com
Sab 15 Mar 2014 18:30:47 CET


2014-03-14 23:33 GMT+01:00 Balan Victor <balan.victor0 a gmail.com>:

> Il giorno 14 marzo 2014 18:12, Manlio Perillo <manlio.perillo a gmail.com>ha scritto:
>
>
>>
>>
>> 2014-03-13 19:35 GMT+01:00 Balan Victor <balan.victor0 a gmail.com>:
>>
>> Di recente ho letto un po di tornado, e in particolare mi sono soffermato
>>> sul modulo tornado.httpserver(Non-blocking HTTP server). Stando a quello
>>> che c'è scritto sulla documentazione ufficiale parla di "non-blocking,
>>> single-threaded HTTP server" e di risolvere il problemi di tipo C10K. Qua
>>> sembra interessante, anche se non ho la minima idea di come funzioni.
>>>
>> > [...]
>>
>> L'argomento è complesso.
>>
> hai da consigliare qualche post/documento/libero che spiega bene
> l'argomento?(Italiano/Inglese) ? Su google ne ho trovato alcuni ma  non
> sono il massimo della chiarezza
>
>
Purtroppo no.


>  Nel caso di un server C10K ready ci sono due aspetti principali.
>> Il primo riguarda tutto quel codice che esegue una richiesta ed aspetta
>> una risposta.
>> Il secondo riguarda il paradigma utilizzato per gestire il flusso del
>> codice.
>>
>> Il 97.7% delle librerie disponibili fa qualcosa del tipo:
>>
>>   >>> status = send_request(data)
>>   >>> resp = recv_response()
>>
>> Entrambe le funzioni potrebbero metterci molto tempo a completare, ma
>> questo codice blocca l'intero thread fino a quando resp non è disponibile.
>>
>> Quello che fa tornado è di usare quelle che si chiamano coroutine, o
>> threading cooperativo.
>> In questo caso sia send_request che recv_response bloccano il flusso
>> corrente del codice (la coroutine corrente), ma non l'intero thread perchè
>> usando le coroutine viene effettuato un salto (simile al goto) che va ad
>> eseguire altre funzioni coroutine.
>>
> e se dentro recv_response ho una chiamata al db perché mi dovrebbe
> bloccare?
>

Se usi la libreria giusta non blocca.
Ad esempio la libpq ha un API scritta come si deve (una delle poche,
purtroppo, almeno per quello che so) e che permette di fare richieste
asincrone.

se sono eseguiti in "coruotine" la chiamata al db non dovrebbe andare a
> girare in qualche modo in background?
>

Come detto, devi usare la libreria giusta.
PostgreSQL usa libpq che offre un API asincrona, e psycopg usa questa API e
le coroutine per fornire una API "semplice".  Vedi la documentazione


sa: gevent (l'implementazione delle coroutine) sembra risolva tutti i
> problemi, ma in realtà tutto quello che fa ha un costo.  Non è un caso che
> i web server C10K usano la programmazione tramite callback e macchina a
> stati; questo perchè è molto più efficiente nella gestione della memoria.
>  Ogni coroutine è come un thread ed ha bisogno di memoria per lo stack,
> oltre poi al costo per il context switch.
>
E i multiprocessing?

Quello che fanno le implementazioni delle coroutine più avanzate, come GHC,
Erlang e Go è di reimplementare in user space quello che fa il kernel con i
processi, in modo più semplice (perchè il contesto associato ad un green
thread è più piccolo rispetto a quello associato ad un processo) ed
efficiente, oltre che più "prevedibile".


Ciao  Manlio
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20140315/c6a734e3/attachment.html>


Maggiori informazioni sulla lista Python