2017-08-04 2 views
0

Hé les gars, je travaille sur un prototype pour un projet à mon école (je suis un assistant de recherche donc ce n'est pas un projet gradué). Je cours le céleri sur un groupe de serveur (avec 48 ouvriers/noyaux) qui est déjà installé et fonctionnant. La raison d'être de mon projet est que nous voulons utiliser le céleri pour un certain nombre de gros volumes de fichiers/tâches.Utilisation de Celery (python) et RabbitMQ pour enregistrer les résultats des tâches dans un emplacement de fichier spécifique?

Because of this it is very important that we save results to an actual file, we have gigs upon gigs of data and it WON'T fit in RAM while running the traditional task queue/backend.

... Quoi qu'il en soit Mon prototype (avec fonction add trivial):

task.py

from celery import Celery 

app=Celery() 

@app.task 
def mult(x,y): 
    return x*y 

Et cela fonctionne très bien quand j'Execute: $ celery worker -A task -l info

Mais si j'essaye et ajoute un nouveau backend:

from celery import Celery 

app=Celery() 
app.conf.update(CELERY_RESULT_BACKEND = 'file://~/Documents/results') 
@app.task 
def mult(x,y): 
    return x*y 

J'obtiens une erreur assez importante:

[2017-08-04 13:22:18,133: CRITICAL/MainProcess] Unrecoverable error: 
AttributeError("'NoneType' object has no attribute 'encode'",) 
Traceback (most recent call last): 
    File "/home/bartolucci/anaconda3/lib/python3.6/site-packages/kombu/utils/objects.py", line 42, in __get__ 
return obj.__dict__[self.__name__] 
KeyError: 'backend' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/home/bartolucci/anaconda3/lib/python3.6/site-  packages/celery/worker/worker.py", line 203, in start 
self.blueprint.start(self) 
    File "/home/bartolucci/anaconda3/lib/python3.6/site-packages/celery/bootsteps.py", line 115, in start 
self.on_start() 
    File "/home/bartolucci/anaconda3/lib/python3.6/site-packages/celery/apps/worker.py", line 143, in on_start 
self.emit_banner() 
    File "/home/bartolucci/anaconda3/lib/python3.6/site-packages/celery/apps/worker.py", line 158, in emit_banner 
' \n', self.startup_info(artlines=not use_image))), 
    File "/home/bartolucci/anaconda3/lib/python3.6/site-packages/celery/apps/worker.py", line 221, in startup_info 
results=self.app.backend.as_uri(), 
    File "/home/bartolucci/anaconda3/lib/python3.6/site-packages/kombu/utils/objects.py", line 44, in __get__ 
value = obj.__dict__[self.__name__] = self.__get(obj) 
    File "/home/bartolucci/anaconda3/lib/python3.6/site-packages/celery/app/base.py", line 1183, in backend 
return self._get_backend() 
    File "/home/bartolucci/anaconda3/lib/python3.6/site-packages/celery/app/base.py", line 902, in _get_backend 
return backend(app=self, url=url) 
    File "/home/bartolucci/anaconda3/lib/python3.6/site-packages/celery/backends/filesystem.py", line 45, in __init__ 
self.path = path.encode(encoding) 
AttributeError: 'NoneType' object has no attribute 'encode' 

Je suis seulement 2 jours dans ce projet et ont jamais travaillé avec le céleri (ou une bibliothèque similaire) avant (je viens du côté algorithmiques, mathy de la clôture). Je me bats actuellement avec les docs de guide d'utilisateur de céleri, mais ils sont honnêtement assez clairsemés sur ce détail.

Toute aide est très appréciée et merci.

Répondre

0

En regardant le code de céleri pour backend backend de système de fichiers backend ici. https://github.com/celery/celery/blob/master/celery/backends/filesystem.py#L54

Votre chemin doit commencer par file: /// (3 barres obliques) Vos paramètres est il en commençant par file: // (2 barres obliques)

Vous pouvez également utiliser à la place le chemin absolu du ~.

+0

Cela a réellement répondu à ma question. Le chemin absolu est attendu après tout. Merci pour la réponse rapide. De plus, pour quiconque a un problème similaire au mien, celery (par défaut) n'aura probablement pas accès au répertoire personnel d'un utilisateur. L'utilisation de/tmp/results est un bon endroit pour tester et expérimenter. '' file: /// tmp/results'' a fonctionné pour moi! –