2012-12-26 33 views
7

Sau khi nâng cấp từ cần tây 2.4.5 tôi đã bắt đầu có cần tây tắt máy ngẫu nhiên.
Tôi đang sử dụng cần tây 3.0.12, boto 2.6 và SQS amazon và django 1.2.7 tất cả điều này trên một máy CentOS (pip bãi đóng băng ở phía dưới)Cần tây Tắt

tôi đang chạy

service celerybeat start 
service celeryd start 

Một vài giây sau khi tôi bắt đầu cần tây nó dừng lại (shutdown) và nếu tôi nhìn vào một trong những bản ghi cần tây tôi luôn luôn thấy điều này:

[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. 

tôi sử dụng sử dụng các giá trị thấp cho maxtaskperchild để tái tạo tắt máy nhanh. nếu tôi đưa ra một giá trị cao hơn thì phải mất nhiều thời gian hơn trước khi tắt máy.

EDIT

Trong khi cố gắng để cô lập các vấn đề tôi loại bỏ tất cả các nhiệm vụ tuần hoàn. và bây giờ tôi chỉ có một nhiệm vụ định kỳ và một nhiệm vụ cơ bản không làm gì và tôi vẫn có thể tái tạo lỗi mỗi lần.

@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 tôi

celeryd

/default của tôi/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" 

pip đóng băng của tôi

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 

Trả lời

1

Tôi giả sử bạn có ứng dụng tổn ion đặt vào hàng đợi của bạn một cái gì đó không có định dạng json. Ví dụ như tin nhắn văn bản. Bạn có thể cố gắng thay đổi hàng đợi trong cài đặt cần tây và xem làm thế nào nó sẽ làm việc

+0

đưa thông điệp xảy ra sau khi nó đã đóng cửa, thậm chí nếu tôi làm cho nó không requeue thông điệp nó vẫn tắt máy. – yossi

+1

Celery fistly đọc nhiệm vụ như tin nhắn từ hàng đợi thỏ, bạn thấy ngoại lệ với định dạng nhiệm vụ bất ngờ. Kiểm tra các mục nhập hàng đợi của bạn trong rabbitmq hoặc trong sqs – Rustem

+0

lỗi josn xảy ra khi cố gắng tắt máy. mã là trong phương pháp chặt chẽ trong kombu đây https://github.com/celery/kombu/blob/master/kombu/transport/virtual/__init__.py – yossi

Các vấn đề liên quan