Domanda

Scenario

Ho un processo server implementato in Python e Gevent, che si collega a un servizio back -end su TCP/IP e serve molti client Web (~ 1000 per processo) con contenuti dinamici in rapida evoluzione in base alle modifiche fornite dal servizio back -end. Il servizio è in esecuzione su Ubuntu 10.04 e non funziona su Windows, quindi la piattaforma di destinazione è fissa. Attualmente stiamo usando Python 2.6.6.

Problema

Servire le modifiche a molti clienti può causare un ritardo nell'elaborazione delle modifiche inviate dal backend, quindi il mio piano è quello di dividere il server in più processi. Numerosi processi di lavoro servirebbero i client Web, mentre il processo principale sarebbe comunque connesso al servizio back -end. Sto già usando un pool separato di serre per servire i clienti Web, ma devono essere inseriti nei processi dei lavoratori.

Domanda

Potresti indicarmi un'implementazione del pool di processi di lavoro per Gevent o capire come posso usare il modulo multiprocessing di Python con Gevent nel modo giusto?

Restrizioni

Vorrei evitare di introdurre i thread di Python nei nostri processi, poiché ciò darebbe spazio alla tesi GIL, che ridurrebbe le prestazioni introducendo latenze. Quindi sarebbe una soluzione pulita multiprocessing + gevent, se possibile.

È stato utile?

Soluzione

Ti consiglio di dare un'occhiata Sedano - Sistema di elaborazione delle attività distribuite scritto in Python.

L'idea di base con celery è che hai una coda (sia RabbitMQ o Redis), con i lavoratori scritti come processi Python ed esposti tramite il celeryd demone. Secondo la documentazione del sedano, celeryd Supporta l'esecuzione gevent Anche la modalità (per i processi vincolati I/O della rete), quindi presumibilmente il codice lavoratore non avrebbe bisogno di molte modifiche per essere eseguita in questo ambiente.

Altri suggerimenti

Prenderei in considerazione l'IPC socket personalizzato o l'utilizzo di Zeromq.

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