Qual è il modo migliore per implementare un pool di processi di lavoro compatibili con Gevent?
-
27-10-2019 - |
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.
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.