2013-07-17 24 views
16

Ho due tipi di attività: attività asincrone e attività di pianificazione. Quindi, ecco la mia struttura dir:Come strutturare le attività di sedano

proj 
    | 
    -- tasks 
     | 
     -- __init__.py 
     | 
     -- celeryapp.py  => celery instance defined in this file. 
     | 
     -- celeryconfig.py 
     | 
     -- async 
     | | 
     | -- __init__.py 
     | | 
     | -- task1.py => from proj.tasks.celeryapp import celery 
     | | 
     | -- task2.py => from proj.tasks.celeryapp import celery 
     | 
     -- schedule 
      | 
      -- __init__.py 
      | 
      -- task1.py => from proj.tasks.celeryapp import celery 
      | 
      -- task2.py => from proj.tasks.celeryapp import celery 

Ma quando eseguo il gestore del sedano come di seguito, non funziona. Non può accettare l'attività dallo scheduler del ritmo di sedano.

$ celery worker --app=tasks -Q my_queue,default_queue 

Quindi, esiste una procedura ottimale sull'organizzazione di più file di attività?

+0

Hai provato ad aggiungere '-B' al comando? Dovrebbe eseguire 'celerybeat' – geekazoid

+0

BTW, è un progetto' django'? – geekazoid

+1

Chiedere informazioni su "come strutturare le attività di sedano" è irrilevante/prematuro a meno che * non sappia * che il layout del file è la causa di cose che non funzionano. Inoltre, si prega di fornire maggiori dettagli su cosa "non funziona" e "non può accettare il compito da celerybeat" significa. In altre parole, cosa ti aspetti che accada e cosa succede invece? In particolare. Condividi l'output dell'errore. –

risposta

3

compiti di sedano può essere asincrono, sincronizzazione o in programma dipende dalla sua invocazione

task.delay(arg1,arg2)  #will be async 
task.delay(arg1,arg2).get() #will be sync 
task.delay(arg1,arg2).get() #will be sync 
task.apply_async(args = [arg1,arg2], {'countdown' : some_seconds}) #async with delay 

C'è un sacco di invocazioni a seconda delle esigenze
Tuttavia, è necessario avviare il sedano con la bandiera -B per abilitare sedano scheduler

$ celery worker --app=tasks -B -Q my_queue,default_queue 

Quindi il modo di prendere per organizzare le attività è qualcosa di personale e deppends sulla complessità del progetto, ma penso che li organizzano per il suo tipo di sincronismo w non potrebbe essere l'opzione migliore.

Ho cercato su questo argomento e non ho trovato alcuna guida o consiglio, ma ho letto alcuni casi che organizzano il loro compito con la loro funzionalità.
Ho seguito questo consiglio, perché questo non è un modello, nei miei progetti. Ecco un esempio di come ho fatto

your_app 
    | 
    -- reports 
     | 
     -- __init__.py 
     -- foo_report.py 
     -- bar_report.py 
     -- tasks 
      | 
      -- __init__.py 
      -- report_task.py 
    -- maintenance 
     | 
     -- __init__.py 
     -- tasks 
      | 
      -- __init__.py 
      -- delete_old_stuff_task.py 
    -- twitter 
     | 
     -- __init__.py 
     -- tasks 
      | 
      -- __init__.py 
      -- batch_timeline.py     
6

Sulla base di sedano documentation è possibile importare una struttura di compiti sedano in questo modo:

Per esempio, se si dispone di un (immaginato) albero di directory in questo modo:

| 
|-- foo 
| |-- __init__.py 
| |-- tasks.py 
| 
|-- bar 
    |-- __init__.py 
    |-- tasks.py 

Quindi chiamando app.autodiscover_tasks(['foo', bar']) i moduli foo.tasks e bar.tasks vengono importati.

Problemi correlati