Domanda

Sto cercando un server web Python che è multithread invece di essere multi-processo (come nel caso di mod_python per apache). Voglio che sia multithread perché voglio avere una cache di oggetti in memoria che verrà utilizzata da vari thread http. Il mio server web fa un sacco di cose costose e calcola alcuni array di grandi dimensioni che devono essere memorizzati nella cache per un uso futuro per evitare il ricalcolo. Ciò non è possibile in un ambiente web server multi-processo. Anche archiviare queste informazioni in memcache non è una buona idea in quanto le matrici sono grandi e memorizzarle in memcache porterebbe alla deserializzazione dei dati provenienti da memcache oltre al sovraccarico aggiuntivo di IPC.

Ho implementato un semplice server web usando BaseHttpServer, offre buone prestazioni ma si blocca dopo alcune ore. Ho bisogno di un server web più maturo. È possibile configurare apache per utilizzare mod_python in un modello di thread in modo da poter eseguire un po 'di cache degli oggetti?

È stato utile?

Soluzione

CherryPy . Funzionalità, come elencato dal sito Web:

  • Un server Web veloce, conforme a HTTP / 1.1, con pool di thread WSGI. In genere, CherryPy richiede solo 1-2ms per pagina!
  • Supporto per qualsiasi altro server Web o adattatore abilitato per WSGI, inclusi Apache, IIS, lighttpd, mod_python, FastCGI, SCGI e mod_wsgi
  • Più server HTTP (ad es. su più porte) facili da eseguire contemporaneamente
  • Un potente sistema di configurazione per sviluppatori e implementatori
  • Un sistema di plugin flessibile
  • Strumenti integrati per memorizzazione nella cache, codifica, sessioni, autorizzazione, contenuto statico e molti altri
  • Un adattatore mod_python nativo
  • Una suite di test completa
  • Sostituibile e personalizzabile ... tutto.
  • Profilazione, copertura e supporto di test integrati.

Altri suggerimenti

Valuta di riconsiderare il tuo design. Mantenere un tale stato nel tuo server web è probabilmente una cattiva idea. Il multi-processo è un modo molto migliore per la stabilità.

Esiste un altro modo per condividere lo stato tra processi separati? Che dire di un servizio? Banca dati? Indice?

Sembra improbabile che mantenere una vasta gamma di dati in memoria e fare affidamento su un singolo processo multi-thread per soddisfare tutte le vostre richieste sia il miglior design o architettura per la vostra app.

Twisted può fungere da tale server web. Sebbene non sia multithread stesso, nel trunk corrente è presente un contenitore WSGI multithread (non ancora rilasciato). Puoi controllare il repository SVN ed eseguire:

twistd web --wsgi=your.wsgi.application

È difficile dare una risposta definitiva senza sapere su quale tipo di sito stai lavorando e su quale tipo di carico ti aspetti. Le seconde prestazioni possono essere un requisito serio oppure no. Se hai davvero bisogno di salvare l'ultimo millisecondo, devi assolutamente tenere in memoria i tuoi array. Tuttavia, come altri hanno suggerito, è più che probabile che tu non lo faccia e potresti cavartela con qualcos'altro. Il modello di utilizzo dei dati nell'array può influire sul tipo di scelta effettuata. Probabilmente non è necessario accedere all'intero set di dati dall'array in una sola volta, quindi è possibile suddividere i dati in blocchi più piccoli e metterli nella cache anziché in un grosso grumo. A seconda della frequenza di aggiornamento dei dati dell'array, è possibile scegliere tra memcached, db locale (berkley, sqlite, piccola installazione mysql, ecc.) O un db remoto. Direi memcached per aggiornamenti abbastanza frequenti. Un db locale per qualcosa nella frequenza oraria e remota per la frequenza giornaliera. Una cosa da considerare è anche ciò che accade dopo un errore nella cache. Se all'improvviso 50 client perdono la cache e allo stesso tempo decidono di iniziare a rigenerare quei costosi array, i tuoi box verranno rapidamente ridotti a 8086. Quindi devi prendere in considerazione come lo gestirai. Molti articoli là fuori coprono come recuperare dai mancati cache. Spero che questo sia utile.

Non multithread, ma twisted potrebbe soddisfare le tue esigenze.

Potresti invece utilizzare una cache distribuita accessibile da ogni processo, memcached come esempio mi viene in mente.

web.py mi ha reso felice in passato. Valuta di provarlo.

Ma sembra che una riprogettazione architettonica potrebbe essere la soluzione corretta, sebbene più costosa.

Forse hai un problema con la tua implementazione in Python usando BaseHttpServer . Non c'è motivo per cui "rimanere bloccati" e implementare un semplice server threaded usando BaseHttpServer e threading non dovrebbe essere difficile.

Inoltre, vedi http://pymotw.com/2/BaseHTTPServer/ index.html # module-BaseHTTPServer sull'implementazione di un semplice server multi-thread con HTTPServer e ThreadingMixIn

Uso CherryPy sia personalmente che professionalmente e ne sono estremamente soddisfatto. Faccio anche i tipi di cose che stai descrivendo, come avere cache degli oggetti globali, eseguire altri thread in background, ecc. E si integra bene con Apache; esegui semplicemente CherryPy come server autonomo associato a localhost, quindi utilizza mod_proxy e mod_rewrite per fare in modo che Apache inoltri in modo trasparente le tue richieste a CherryPy.

Il sito Web CherryPy è http://cherrypy.org/

Di recente ho avuto lo stesso problema. Vale a dire: abbiamo scritto un semplice server utilizzando BaseHTTPServer e abbiamo scoperto che il fatto che non sia multi-thread era un grosso svantaggio.

La mia soluzione era quella di portare il server su Pylons ( http://pylonshq.com/ ). La porta è stata abbastanza semplice e uno dei vantaggi è che è molto semplice creare una GUI usando Pylons, quindi sono stato in grado di gettare una pagina di stato in cima a quello che è fondamentalmente un processo daemon.

Riassumerei i piloni in questo modo:

  • è simile a Ruby on Rails in quanto mira a distribuire app Web in modo molto semplice
  • il suo linguaggio di template predefinito, Mako, è molto carino con cui lavorare
  • utilizza un sistema di URL di routing che è molto conveniente
  • le prestazioni per noi non sono un problema, quindi non posso garantire che Pylons si esibisca adeguatamente per le tue esigenze
  • puoi usarlo con Apache & amp; Lighthttpd, anche se non l'ho provato

Eseguiamo anche un'app con Twisted e ne siamo contenti. Twisted ha buone prestazioni, ma trovo che il modello di programmazione single thread / defer-to-thread sia abbastanza complicato. Ha molti vantaggi, ma non sarebbe la mia scelta per un'app semplice.

Buona fortuna.

Giusto per sottolineare qualcosa di diverso dai soliti sospetti ...

Alcuni anni fa mentre stavo usando Zope 2.x ho letto di Medusa in quanto era il web server utilizzato per la piattaforma. Lo hanno pubblicizzato per funzionare bene sotto carico pesante e può fornirti la funzionalità che hai chiesto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top