Задача Django Celery TwythonStreamer SIGSEGV

#django #rabbitmq #celery #django-celery #twython

#джанго #rabbitmq #сельдерей #django-сельдерей #twython

Вопрос:

У меня был проект Django, в котором соединение TwythonStreamer было запущено на рабочем устройстве задачи сельдерея. Соединение запускается и перезагружается при изменении условий поиска. Однако в его текущем состоянии и до обновления проекта до Celery 3.1.1 он будет SIGSEGV при попытке запуска этой конкретной задачи. Я могу выполнить те же команды задачи в оболочке Django и заставить ее работать просто отлично:

 tu = TwitterUserAccount.objects.first()
stream = NetworkStreamer(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET, tu.twitter_access_token, tu.twitter_access_token_secret)
stream.statuses.filter(track='foo,bar')
  

однако с запущенным RabbitMQ / Celery (в то время как в virtualenv проекта) в другом окне:

 celery worker --app=project.app -B -E -l INFO 
  

и попытайтесь запустить:

 @task()
def test_network():
  tu = TwitterUserAccount.objects.first()
  stream = NetworkStreamer(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET, tu.twitter_access_token, tu.twitter_access_token_secret)
  

в оболочке Django через:

 test_network.apply_async()
  

следующая ошибка SIGSEVG возникает в окне Сельдерея (при инициализации сетевого потока):

 Task project.app.tasks.test_network with id 5a9d1689-797a-4d35-8bf3-9795e51bb0ec raised exception:
"WorkerLostError('Worker exited prematurely: signal 11 (SIGSEGV).',)"


Task was called with args: [] kwargs: {}.

The contents of the full traceback was:

Traceback (most recent call last):
 File "/Users/foo_user/.virtualenvs/project/lib/python2.7/site-packages/billiard/pool.py", line 1170, in mark_as_worker_lost
human_status(exitcode)),
WorkerLostError: Worker exited prematurely: signal 11 (SIGSEGV).
  

NetworkStreamer — это просто унаследованный TwythonStreamer (как показано здесь).

У меня есть другие задачи сельдерея, которые отлично выполняются в дополнение к различным задачам сельдерея. выполняется djcelery.setup_loader() и т.д. Я пытался настроить различные настройки (думал, что это могла быть проблема с рассолом), но я даже не передаю никаких параметров. Эта структура проекта заключается в том, как настраивается Сельдерей, присваивается имя и т. Д…

 BROKER_URL = 'amqp://'
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
CELERY_RESULT_ENGINE_OPTIONS = {"echo": True}
CELERY_TASK_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_BACKEND = 'amqp'

# Short lived sessions, disabled by default
CELERY_RESULT_PERSISTENT = True
CELERY_RESULT_BACKEND = 'amqp'
CELERY_TASK_RESULT_EXPIRES = 18000  # 5 hours.
CELERY_SEND_TASK_ERROR_EMAILS = True
  

Версии:

  • Python: 2.7.5
  • RabbitMQ: 3.3.4
  • Django==1.6.5
  • amqp ==1.4.5
  • бильярд ==3.3.0.18
  • сельдерей ==3.1.12
  • django-celery ==3.1.10
  • цветок == 0.7.0
  • psycopg2==2.5.3
  • pytz ==2014.4
  • twython==3.1.2

Комментарии:

1. Из amqp документации: This library should be API compatible with librabbitmq . Убедитесь, что это так.