2016-05-18 31 views
7

Sto creando un server web django che consente all'utente di eseguire alcuni "eseguibili" su una macchina locale e di analizzare il loro output attraverso una pagina web.Celery vs. ProcessPoolExecutor/ThreadPoolExecutor

In precedenza ho utilizzato una coda di attività di Celery per eseguire "eseguibili" in situazioni simili. Tuttavia, dopo aver letto su Python concurrent.futures, sto iniziando a chiedermi se dovrei usare ThreadPoolExecutor o ProcessPoolExecutor (o ThreadPoolExecutor all'interno di un ProcessPoolExecutor: D)?

Googling Ho potuto trovare solo one relevant question confrontando Celery con Tornado e ho deciso di utilizzare solo Tornado.

Quindi dovrei usare Celery o un PoolExecutor per il mio semplice webserver, e perché?

risposta

4

è necessario utilizzare il sedano se:

  1. Si vuole scalare facilmente e in modo indipendente dal server web
  2. Volete un modo per monitorare il vostro compito e riprovare loro se non riescono
  3. Si desidera creare schemi di esecuzione di attività più avanzati (ad esempio catena)

In aggiunta a questa è una libreria molto matura con progetti paralleli che ti aiuta anche sul lato di presentazione dell'interfaccia utente, dare un'occhiata a Jobtastic.

Se non hai bisogno di uno dei punti elencati e devi solo eseguire questa attività senza preoccuparti troppo dello stato e senza particolari esigenze di scalabilità piuttosto che mantenerla semplice.

Informazioni sull'uso ThreadPoolExecutor o ProcessPoolExecutor basta tenere a mente che il secondo sarà in grado di ricevere e restituire solo gli oggetti pickable e che il primo sarà deporre le uova thread figlio attaccato al processo principale (probabilmente il vostro server web, se non si utilizza dentro un altro processo distaccato), quindi l'approccio di mixarli può avere senso in base ai dettagli della vostra implementazione.