2012-12-26 12 views
7

셀러리 2.4.5에서 업그레이드 한 후 셀 룰리를 임의로 종료하기 시작했습니다.
나는 2.6 BOTO, 셀러리 3.0.12을 사용하고과에 CentOS 시스템에서 아마존 SQS와 장고 1.2.7 모든 일이 내가샐러리 종료

service celerybeat start 
service celeryd start 

몇 가지를 실행하고

(하단에 동결 덤프 PIP) 초 후 난 멈출 셀러리 (종료)를 시작하고 난 셀러리 로그 중 하나에 보면 난 항상이를 참조하십시오

[2012-12-31 10:13:40,275: INFO/MainProcess] Task patrol.tasks.test[270f1558-bcc2-441b-8961 e1f21a2dbd27] succeeded in 0.318082094193s: None 
[2012-12-31 10:13:40,424: INFO/MainProcess] child process calling self.run() 
[2012-12-31 10:13:40,428: INFO/MainProcess] Got task from broker: patrol.tasks.myTask[d9a5ab26-71ca-448b-a4da-40315570f219] 
[2012-12-31 10:13:40,666: INFO/MainProcess] Got task from broker: tasks.test[99edb7e2-caff-4892-a95b-c18a9d7f5c51] 
[2012-12-31 10:13:41,114: WARNING/MainProcess] Restoring 2 unacknowledged message(s). 
[2012-12-31 10:13:41,115: WARNING/MainProcess] UNABLE TO RESTORE 2 MESSAGES: (TypeError('<boto.sqs.message.Message instance at 0x3269758> is not JSON serializable',), TypeError('<boto.sqs.message.Message instance at 0x32697e8> is not JSON serializable',)) 
[2012-12-31 10:13:41,116: WARNING/MainProcess] EMERGENCY DUMP STATE TO FILE -> /tmp/tmppO4Bbp <- 
[2012-12-31 10:13:41,116: WARNING/MainProcess] Cannot pickle state: TypeError('a class that defines __slots__ without defining __getstate__ cannot be pickled',). Fallback to pformat. 

나는 빨리 종료를 다시 maxtaskperchild을 위해 사용 낮은 값을 사용합니다. 내가 더 높은 값을 주면 시스템 종료가 발생하기까지 더 오래 걸립니다. 문제를 격리하는 중에

편집

내가 모든주기적인 작업을 제거했습니다. 그리고 지금은 하나의주기적인 작업과 하나의 작업을 기본적으로 수행하지 않으며 여전히 버그를 매번 재생할 수 있습니다.

@task 
def myTask(): 
    print 1 
    return 

class test(PeriodicTask): 
    run_every = datetime.timedelta(seconds=3) 
    def run(self, **kwargs): 
      myTask.delay() 
      print '2' 

내 /init.d/celeryd

celeryd

내/기본/celeryd

# Name of nodes to start, here we have a single node 
# or we could have three nodes: 
CELERYD_NODES="w1 w2" 

CELERYD_LOG_LEVEL="INFO" 

# Where to chdir at start. 
CELERYD_CHDIR="/var/myproject" 

# How to call "manage.py celeryd_multi" 
CELERYD_MULTI="python $CELERYD_CHDIR/manage.py celeryd_multi" 

# How to call "manage.py celeryctl" 
CELERYCTL="python $CELERYD_CHDIR/manage.py celeryctl" 

MAXTASKPERCHILD=2 # this is low on purpose to recreate the shutdown fast 
CELERY_CONC=5 
EXPRESS_CONC=2 
# Extra arguments to celeryd 
CELERYD_OPTS="-Q:w1 celery,backup -c:w1 $CELERY_CONC -Q:w2 express -c:w2 $EXPRESS_CONC --time-limit=3600 --maxtasksperchild=$MAXTASKPERCHILD -E" 

# Name of the celery config module. 
CELERY_CONFIG_MODULE="celeryconfig" 

# %n will be replaced with the nodename. 
CELERYD_LOG_FILE="/var/log/celeryd/%n.log" 
CELERYD_PID_FILE="/var/run/celeryd/%n.pid" 

# Name of the projects settings module. 
export DJANGO_SETTINGS_MODULE="settings" 

# Path to celerybeat 
CELERYBEAT="python $CELERYD_CHDIR/manage.py celerybeat" 

# Extra arguments to celerybeat. This is a file that will get 
# created for scheduled tasks. It's generated automatically 
# when Celerybeat starts. 
CELERYBEAT_OPTS="--schedule=/var/run/celerybeat-schedule" 

# Log level. Can be one of DEBUG, INFO, WARNING, ERROR or CRITICAL. 
CELERYBEAT_LOG_LEVEL="INFO" 

# Log file locations 
CELERYBEAT_LOGFILE="/var/log/celeryd/celerybeat.log" 
CELERYBEAT_PIDFILE="/var/run/celeryd/celerybeat.pid" 

난 당신이 응용 제품이 있다고 가정

Django==1.2.7 
M2Crypto==0.20.2 
MySQL-python==1.2.3c1 
amqp==1.0.6 
amqplib==1.0.2 
anyjson==0.3.3 
billiard==2.7.3.19 
boto==2.1.1 
celery==3.0.12 
certifi==0.0.6 
distribute==0.6.10 
django-celery==3.0.11 
django-kombu==0.9.4 
django-picklefield==0.3.0 
ghettoq==0.4.5 
importlib==1.0.2 
iniparse==0.3.1 
ipython==0.12 
kombu==2.5.4 
lxml==2.3.4 
mixpanel-celery==0.5.0 
netaddr==0.7.6 
numpy==1.6.2 
odict==1.4.4 
ordereddict==1.1 
pycrypto==2.6 
pycurl==7.19.0 
pygooglechart==0.3.0 
pygpgme==0.1 
python-dateutil==1.5 
python-memcached==1.48 
pytz==2012h 
requests==0.9.0 
six==1.2.0 
urlgrabber==3.9.1 
yum-metadata-parser==1.1.2 

답변

1

내 핍 동결 이온은 json 형식이 아닌 여러분의 큐에 넣습니다. 예를 들어 텍스트 메시지. 셀러리 설정에서 대기열을 변경하고 작동 방식을 확인하려고 할 수 있습니다.

+0

참조하십시오. – yossi

+1

셀러리가 rabist-queue에서 작업을 fistly 메시지로 읽습니다. 예기치 않은 작업 형식으로 예외가 표시됩니다. rabbitmq 또는 sqs – Rustem

+0

의 대기열 항목을 확인하여 종료하는 동안 josn 오류가 발생했습니다. 코드는 kombu의 close 메소드에 있습니다. https://github.com/celery/kombu/blob/master/kombu/transport/virtual/__init__.py – yossi

0

Kombu에서 Kombu는 2.5.4 이후의 모든 버전으로 업그레이드합니다. Celery> = 3.0.20의 모든 릴리스에서 수정되어야합니다 (kombu> = 2.5.5에 따라 다름).

내가 그것이 아직 종료 메시지를 다시 대기하지 만들 경우에도, 이미 종료 한 후 메시지가 발생 퍼팅 http://kombu.readthedocs.org/en/latest/changelog.html#version-2-5-5

관련 문제