Как мне справиться с работой с celeryd_multi из кода? - PullRequest
3 голосов
/ 07 сентября 2011

До сих пор я работал только с python manage.py celeryd, начиная его так:

python manage.py celeryd -l info --settings=settings

Код, на мой взгляд, делает это:

BinaryExecTask.delay(request.POST["binary_path"])

И код из моего settings.py, это:

import djcelery
djcelery.setup_loader()

BROKER_BACKEND = "djkombu.transport.DatabaseTransport"
#celery
BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "guest"
BROKER_PASSWORD = "guest"
BROKER_VHOST = "/"

и он выполнит некоторые двоичные файлы в фоновом режиме. Дело в том, что некоторым двоичным файлам требуется довольно короткое время, а другим - до получаса. Работая с celeryd, все мои задачи блокируются, пока текущая не завершит свое выполнение. Я видел здесь несколько примеров запуска celeryd_multi, но запуска:

python manage.py celeryd_multi start 3 --settings=settings -l info

выдает эту ошибку:

celeryd-multi v2.3.1
> Starting nodes...
        > celery1.x: Traceback (most recent call last):
  File "manage.py", line 14, in <module>
    execute_manager(settings)
  File "c:\code\python27\lib\site-packages\django-1.3-py2.7.egg\django\core\management\_
 line 438, in execute_manager
    utility.execute()
  File "c:\code\python27\lib\site-packages\django-1.3-py2.7.egg\django\core\management\_
 line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "c:\code\python27\lib\site-packages\django_celery-2.3.3-py2.7.egg\djcelery\manage
s\celeryd_multi.py", line 22, in run_from_argv
    ["%s %s" % (argv[0], argv[1])] + argv[2:])
  File "c:\code\python27\lib\site-packages\celery-2.3.1-py2.7.egg\celery\bin\celeryd_mul
 172, in execute_from_commandline
    self.commands[argv[0]](argv[1:], cmd)
  File "c:\code\python27\lib\site-packages\celery-2.3.1-py2.7.egg\celery\bin\celeryd_mul
 205, in start
    retcode = self.waitexec(argv)
  File "c:\code\python27\lib\site-packages\celery-2.3.1-py2.7.egg\celery\bin\celeryd_mul
 354, in waitexec
    pipe = Popen(argstr, env=self.env)
  File "c:\code\python27\lib\subprocess.py", line 672, in __init__
    errread, errwrite)
  File "c:\code\python27\lib\subprocess.py", line 882, in _execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

celeryd-multi start 3 -c 3 выдает ту же ошибку. Что я должен сделать, чтобы я мог успешно запустить экземпляр сельдерея, который позволит мне выполнять больше задач параллельно? Кроме того, мне нужно сделать что-то другое, на мой взгляд?

РЕДАКТИРОВАТЬ: некоторые отладки привели меня сюда (site-packages \ celery-2.3.1-py2.7.egg \ celery \ bin \ celeryd_multi.py (354) waitexec)

351         def waitexec(self, argv, path=sys.executable):
352             args = " ".join([path] + list(argv))
353  ->         argstr = shlex.split(args.encode("utf-8"))
354             pipe = Popen(argstr, env=self.env)
(Pdb) p argstr
['c:codepython27python.exe', 'manage.py', 'celeryd_detach', '-l', 'info', '--pidfile=celeryd@1.pid',
 '-n', 'celery1.x', '--logfile=celeryd@1.log']
(Pdb) p Popen(argstr, env=self.env)
*** WindowsError: WindowsError(2, 'The system cannot find the file specified')
(Pdb)

Итак, как мы видим, путь к Python разрушен :). Что мне делать дальше?

EDIT2: я открыл проблему здесь

1 Ответ

1 голос
/ 07 сентября 2011

Похоже на что-то специфичное для Windows ... Вы пытались указать полный путь к исполняемому файлу python в командной строке, как

C:\code\python27\bin\python.exe manage.py celeryd_multi start 3 --settings=settings -l info

Кроме того, использование полных путей для файла Python может быть полезным

C:\code\python27\bin\python.exe  C:\path\to\your\project\manage.py celeryd_multi start 3 --settings=settings -l info
...