6
votes

Est-ce qu'il y a une file d'attente de tâches distribuée à Python qui me permet de tuer des tâches suspendues qui ne sont pas disposées à coopérer

Fondamentalement, j'ai beaucoup de tâches (par lots d'environ 1000) et des temps d'exécution de ces tâches peuvent varier considérablement (de moins de la seconde à 10 minutes). Je sais que si une tâche exécute plus d'une minute, je peux le tuer. Ces tâches sont des étapes de l'optimisation de certains modèles d'extraction de données (mais sont indépendantes les unes des autres) et passent la plupart du temps à l'intérieur de certaines fonctions d'extension C afin de ne pas coopérer si j'essayais de les tuer gracieusement.

Y a-t-il une file d'attente de tâches distribuée qui correspond à ce schéma - Afaik: Celeriing permet d'abandonner les tâches qui sont disposées à coopérer. Mais je pourrais avoir tort.

J'ai récemment posé une question similaire à propos de tuer des fonctions suspendues dans python tuer Fonction suspendue en python dans le respiorment multithreadisé .

Je suppose que je pourrais sous-classe la tâche de céleri de la sous-classe, de sorte qu'elle apparaisse un nouveau processus, puis exécute sa charge utile qui a abandonné son exécution si elle est longue, mais je serais tué par des frais généraux de l'initialisation de nouvel interprète.


1 commentaires

Avez-vous jetté un coup d'oeil à ipython.parallallel ? Il soutient l'équilibrage de la charge et les délais d'attente.


3 Réponses :


0
votes

pistil permet une gestion multiple de processus, y compris la tuerie des tâches non coopératives.

mais:

  • C'est le logiciel bêta, même s'il pouvait pouvoir gunlorn qui est fiable
  • Je ne sais pas comment il gère 1000 processus
  • La communication entre le processus n'est pas encore incluse, vous devrez donc configurer votre propre utilisation par exemple Zeromq

    Une autre possibilité consiste à utiliser le signal de la minuterie Cela soulève donc une exception en 36 000 secondes. Mais les signaux ne sont pas tricètes si quelqu'un acquérait la gil, que votre programme peut faire.


0 commentaires

6
votes

céleri prend en charge limitation du temps . Vous pouvez utiliser des limites de temps pour tuer des tâches longues. Outre les tâches d'assassinat, vous pouvez utiliser les limites molle em> qui permettent de gérer softimeliimitexeded em> exceptions dans les tâches et à terminer des tâches proprement.

from celery.task import task
from celery.exceptions import SoftTimeLimitExceeded

@task
def mytask():
    try:
        do_work()
    except SoftTimeLimitExceeded:
        clean_up_in_a_hurry()


0 commentaires

0
votes

Lorsque vous révoquez une tâche de céleri, vous pouvez le fournir avec un (code> en option) Terminez = TRUE CODE> Mot-clé.

task.revoke(terminate=True)


0 commentaires