Использование Celery с SQLAlchemy и Pyramid

Я создаю веб-приложение, используя Pyramid-1.2.1 с SQLAlchemy в качестве базы данных.
Теперь мне нужно выполнять некоторые периодические задачи вместе с этим приложением, и я хочу использовать Celery в качестве обработчика задач и SQLAlchemy в качестве очереди сообщений. и результат бэкэнд.

1) Установил Celery-2.1.4 но не могу понять как заставить его работать. Вот мой celeryconfig.py файл:

# List of modules to import when celery starts.
CELERY_IMPORTS = ("my_app.tasks", )

## Result store settings.
CELERY_RESULT_BACKEND = "database"
CELERY_RESULT_DBURI = "sqlite:///MyDataBase.db"
CELERY_RESULT_SERIALIZER = "json"

## Broker settings.
BROKER_TRANSPORT = "sqlakombu.transport.Transport"
BROKER_HOST = "sqlite:///MyDataBase.db"

my_app.tasks содержат простую задачу сложения из примеров с сельдереем.
Теперь, когда я запускаю

$ celeryd -l info

Я вижу следующее:

[2011-11-11 20:22:50,750: WARNING/MainProcess] [email protected] v2.1.4 is starting.
[2011-11-11 20:22:50,765: WARNING/MainProcess]  
Configuration ->
    . broker -> sqlakombu.transport.Transport://guest@sqlite:///MyDataBase.db/
    . queues ->
        . celery -> exchange:celery (direct) binding:celery
    . concurrency -> 4
    . loader -> celery.loaders.default.Loader
    . logfile -> [stderr]@INFO
    . events -> OFF
    . beat -> OFF
    . tasks ->
        . chatrooms.task.add
[2011-11-11 20:22:50,787: INFO/PoolWorker-1] child process calling self.run()
[2011-11-11 20:22:50,789: INFO/PoolWorker-2] child process calling self.run()
[2011-11-11 20:22:50,791: INFO/PoolWorker-3] child process calling self.run()
[2011-11-11 20:22:50,796: INFO/PoolWorker-4] child process calling self.run()
[2011-11-11 20:22:50,802: WARNING/MainProcess] [email protected] has started.
[2011-11-11 20:22:50,804: WARNING/MainProcess] Traceback (most recent call last):
[2011-11-11 20:22:50,805: WARNING/MainProcess] File "/Users/shashkin/python_v_env/bin/celeryd", line 8, in <module>
[2011-11-11 20:22:50,805: WARNING/MainProcess] load_entry_point('celery==2.1.4', 'console_scripts', 'celeryd')()
[2011-11-11 20:22:50,805: WARNING/MainProcess] File "/Users/shashkin/python_v_env/lib/python2.7/site-packages/celery-2.1.4-py2.7.egg/celery/bin/celeryd.py", line 166, in main
[2011-11-11 20:22:50,805: WARNING/MainProcess] worker.execute_from_commandline()
[2011-11-11 20:22:50,806: WARNING/MainProcess] File "/Users/shashkin/python_v_env/lib/python2.7/site-packages/celery-2.1.4-py2.7.egg/celery/bin/base.py", line 40, in execute_from_commandline
[2011-11-11 20:22:50,806: WARNING/MainProcess] return self.run(*args, **vars(options))
[2011-11-11 20:22:50,806: WARNING/MainProcess] File "/Users/shashkin/python_v_env/lib/python2.7/site-packages/celery-2.1.4-py2.7.egg/celery/bin/celeryd.py", line 85, in run
[2011-11-11 20:22:50,806: WARNING/MainProcess] return Worker(**kwargs).run()
[2011-11-11 20:22:50,806: WARNING/MainProcess] File "/Users/shashkin/python_v_env/lib/python2.7/site-packages/celery-2.1.4-py2.7.egg/celery/apps/worker.py", line 121, in run
[2011-11-11 20:22:50,807: WARNING/MainProcess] self.run_worker()
[2011-11-11 20:22:50,807: WARNING/MainProcess] File "/Users/shashkin/python_v_env/lib/python2.7/site-packages/celery-2.1.4-py2.7.egg/celery/apps/worker.py", line 219, in run_worker
[2011-11-11 20:22:50,807: WARNING/MainProcess] worker.start()
[2011-11-11 20:22:50,807: WARNING/MainProcess] File "/Users/shashkin/python_v_env/lib/python2.7/site-packages/celery-2.1.4-py2.7.egg/celery/worker/__init__.py", line 217, in start
[2011-11-11 20:22:50,808: WARNING/MainProcess] component.start()
[2011-11-11 20:22:50,808: WARNING/MainProcess] File "/Users/shashkin/python_v_env/lib/python2.7/site-packages/celery-2.1.4-py2.7.egg/celery/worker/listener.py", line 238, in start
[2011-11-11 20:22:50,808: WARNING/MainProcess] self.reset_connection()
[2011-11-11 20:22:50,808: WARNING/MainProcess] File "/Users/shashkin/python_v_env/lib/python2.7/site-packages/celery-2.1.4-py2.7.egg/celery/worker/listener.py", line 416, in reset_connection
[2011-11-11 20:22:50,808: WARNING/MainProcess] self.connection = self._open_connection()
[2011-11-11 20:22:50,808: WARNING/MainProcess] File "/Users/shashkin/python_v_env/lib/python2.7/site-packages/celery-2.1.4-py2.7.egg/celery/worker/listener.py", line 480, in _open_connection
[2011-11-11 20:22:50,809: WARNING/MainProcess] max_retries=conf.BROKER_CONNECTION_MAX_RETRIES)
[2011-11-11 20:22:50,809: WARNING/MainProcess] File "/Users/shashkin/python_v_env/lib/python2.7/site-packages/celery-2.1.4-py2.7.egg/celery/utils/__init__.py", line 276, in retry_over_time
[2011-11-11 20:22:50,809: WARNING/MainProcess] retval = fun(*args, **kwargs)
[2011-11-11 20:22:50,809: WARNING/MainProcess] File "/Users/shashkin/python_v_env/lib/python2.7/site-packages/celery-2.1.4-py2.7.egg/celery/worker/listener.py", line 472, in _establish_connection
[2011-11-11 20:22:50,809: WARNING/MainProcess] conn.connect()                              # evaluate connection
[2011-11-11 20:22:50,809: WARNING/MainProcess] File "/Users/shashkin/python_v_env/lib/python2.7/site-packages/carrot-0.10.7-py2.7.egg/carrot/connection.py", line 170, in connect
[2011-11-11 20:22:50,810: WARNING/MainProcess] return self.connection
[2011-11-11 20:22:50,810: WARNING/MainProcess] File "/Users/shashkin/python_v_env/lib/python2.7/site-packages/carrot-0.10.7-py2.7.egg/carrot/connection.py", line 135, in connection
[2011-11-11 20:22:50,810: WARNING/MainProcess] self._connection = self._establish_connection()
[2011-11-11 20:22:50,810: WARNING/MainProcess] File "/Users/shashkin/python_v_env/lib/python2.7/site-packages/carrot-0.10.7-py2.7.egg/carrot/connection.py", line 148, in _establish_connection
[2011-11-11 20:22:50,810: WARNING/MainProcess] return self.create_backend().establish_connection()
[2011-11-11 20:22:50,810: WARNING/MainProcess] File "/Users/shashkin/python_v_env/lib/python2.7/site-packages/carrot-0.10.7-py2.7.egg/carrot/connection.py", line 161, in create_backend
[2011-11-11 20:22:50,810: WARNING/MainProcess] return backend_cls(connection=self)
[2011-11-11 20:22:50,811: WARNING/MainProcess] TypeError
[2011-11-11 20:22:50,811: WARNING/MainProcess] :
[2011-11-11 20:22:50,811: WARNING/MainProcess] __init__() takes exactly 2 arguments (1 given)
[2011-11-11 20:22:50,811: INFO/MainProcess] process shutting down

Что мне не хватает?

2) Позже я хочу запустить Celery в своем приложении. Что мне делать после установки пакета celery-pylons? Должен ли я поместить настройки сельдерея в файл .ini приложения? Может ли кто-нибудь привести мне какой-нибудь пример, потому что те, что я нашел в сети, мне не очень помогли.

Спасибо.


person Dmitry A. Shashkin    schedule 11.11.2011    source источник
comment
Я не эксперт по Celery, но похоже, что вы предоставляете собственный бэкенд для carrot, а сигнатура метода __init__ вашего пользовательского класса транспорта неверна.   -  person Simone Deponti    schedule 29.11.2011
comment
База данных существует? Если вы не пробовали создать его, можете ли вы установить соединение с базой данных, используя ››› myconn = BrokerConnection(sqlite:///MyDataBase.db, transport=sqlakombu.transport.Transport)   -  person Thomas Bartelmess    schedule 09.12.2011
comment
Вы должны создать 2 разных вопроса SO. Думаю проще ответить.   -  person Danny Navarro    schedule 14.12.2011


Ответы (1)


Это похоже на проблему совместимости версий между celery пакетами и их зависимостями. С последней версией сельдерея 2.4.5 ваш пример просто работает. С 2.1.4 получаю ту же ошибку.

Если по какой-либо причине вам нужна только версия 2.1.4 сельдерея, вам нужно выяснить, какие зависимости вам нужно понизить, чтобы заставить его работать. Глядя на трассировку, скорее всего, это будет пряник dependency, но вы можете попасть в ад зависимостей, если другим зависимостям нужна определенная версия carrot.

Я настоятельно рекомендую использовать virtualenv с pip, чтобы иметь возможность легко экспериментировать с версиями пакетов. Попытка разработать что-то с использованием пакетов Python из репозиториев Linux может быть очень болезненной.

версии сборки или требования к pip решают проблемы такого рода, но, насколько мне известно, для сельдерея нет набора закрепленных версий зависимостей.

person Danny Navarro    schedule 13.12.2011
comment
На самом деле я отложил эту задачу, поэтому я не проводил полное тестирование сейчас, но я попытался хотя бы запустить celeryd и похоже, что это работает с v2.4. Более того, моя глупая вина заключалась в том, что я перепутал версии 2.1.4 и 2.4.1 (последние на тот момент) и выбрал не ту. Еще раз спасибо, что открыли мне глаза! :) - person Dmitry A. Shashkin; 14.12.2011