Dans une management command, déclenchée depuis une vue pour mettre à jour un trigger, je me demande ce qui est le plus approprié entre mutiprocessing ou la même chose à partir de ce qu'explique kan4r ici sur le Threading
J'ai aussi lu que multiprocessing avait une emprunte mémoire plus importante que Threading par exemple, mais que le threading avec GIL ...
Aussi, dans ma vue pour éviter qu'on soumette une demande de mise à jour plusieurs fois pendant que la 1° requete n'est pas finie, je colle dans un coin du cache qu'une requête est en cours via
cache.set('django_th' + '_fire_trigger_' + trigger_id)
(ce qui explique du coup le cache.delete()
à la fin du script ci dessous)
Le code ressemblerait selon le cas à
from multiprocessing import Pool, TimeoutError
ou
from multiprocessing.pool import ThreadPool as Pool, TimeoutError
et continuerait par
def handle(self, *args, **options):
"""
get the trigger to fire
"""
trigger_id = options.get('trigger_id')
trigger = TriggerService.objects.filter(
id=int(trigger_id),
status=True,
user__is_active=True,
).select_related('consumer__name', 'provider__name')
try:
with Pool(processes=1) as pool:
result = pool.map_async(reading, trigger)
result.get(timeout=360)
result = pool.map_async(publishing, trigger)
result.get(timeout=360)
cache.delete('django_th' + '_fire_trigger_' + trigger_id)
except TimeoutError as e:
logger.warn(e)