2017-06-13 1 views
2

Ich habe eine schwere externe Bibliothek Klasse, die Zeit braucht, um zu initialisieren und viel Speicher verbraucht. Ich möchte es mindestens einmal pro Aufgabeninstanz erstellen.ist Sellerie-Aufgabe für jeden Worker-Prozess oder einmal pro App initialisiert?

class NlpTask(Task): 
    def __init__(self): 
     print('initializing NLP parser') 
     self._parser = nlplib.Parser() 
     print('done initializing NLP parser') 

    @property 
    def parser(self): 
     return self._parser 

@celery.task(base=NlpTask) 
def my_task(arg): 
    x = my_task.parser.process(arg) 
    # etc. 

Sellerie beginnt 32 Worker-Prozesse, so würde ich den Druck "initializing ... done" 32 mal erwarten, wie ich, dass eine Taskinstanz übernehme für jeden Arbeiter geschaffen wird. Überraschenderweise bekomme ich den Druck einmal. Was passiert dort eigentlich? Vielen Dank.

Antwort

1

Ihre NlpTask wird einmalig initialisiert, wenn sie beim Mitarbeiter registriert wird.

Wenn Sie zwei Aufgaben wie

@celery.task(base=NlpTask) 
def foo(arg): 
    pass 


@celery.task(base=NlpTask) 
def bar(arg): 
    pass 

Dann, wenn Sie einen Arbeiter beginnen, werden Sie 2 Initialisierungen sehen.

Wenn Sie es einmal für jeden Arbeiter initialisieren möchten, können Sie worker_process_init Signal verwenden.

from celery.signals import worker_process_init 


@worker_process_init.connect() 
def setup(**kwargs): 
    print('initializing NLP parser') 
    # setup 
    print('done initializing NLP parser') 

Nun, wenn Sie einen Arbeiter beginnen, sehen Sie Setup einmal von jedem Prozess aufgerufen wird.

+0

das ist mein Punkt - ich würde einmal pro Arbeiter erwarten, und es scheint wie einmal pro Sellerie-Instanz. Ich habe die Frage bearbeitet – davka

+0

@davka Aktualisierte Antwort. – ChillarAnand

Verwandte Themen