Problema com Celery "process exiting with exitcode 1"
16 de Dezembro de 2010, 0:00 - sem comentários aindaHoje estava rodando o Celery em um projeto e me deparei com um problema, o "process exiting with exitcode 1" quando dava start no Celery:[root@xen-01 gonow]# python2.7 manage.py celeryd -v 2 -B -s celery -E -l INFO
[2010-12-16 09:18:13,184: WARNING/MainProcess] celery@xen-01 v2.1.3 is starting.
[2010-12-16 09:18:13,185: WARNING/MainProcess] /usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/apps/
worker.py:107: UserWarning: Running celeryd with superuser privileges is not encouraged!
"Running celeryd with superuser privileges is not encouraged!")
[2010-12-16 09:18:13,185: WARNING/MainProcess] /usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/apps/
worker.py:110: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in a production environment!
warnings.warn("Using settings.DEBUG leads to a memory leak, "
[2010-12-16 09:18:13,188: WARNING/MainProcess]
Configuration ->
. broker -> ghettoq.taproot.Database://guest@localhost/
. queues ->
. celery -> exchange:celery (direct) binding:celery
. concurrency -> 2
. loader -> djcelery.loaders.DjangoLoader
. logfile -> [stderr]@INFO
. events -> ON
. beat -> ON
. tasks ->
. gonow.vps.tasks.lvm
[2010-12-16 09:18:13,213: INFO/PoolWorker-2] child process calling self.run()
[2010-12-16 09:18:13,223: INFO/PoolWorker-3] child process calling self.run()
[2010-12-16 09:18:13,237: INFO/Beat] child process calling self.run()
[2010-12-16 09:18:13,239: INFO/Beat] Celerybeat: Starting...
[2010-12-16 09:18:13,239: WARNING/MainProcess] celery@xen-01 has started.
[2010-12-16 09:18:13,257: INFO/Beat] process shutting down
[2010-12-16 09:18:13,258: WARNING/Beat] Process Beat:
[2010-12-16 09:18:13,259: WARNING/Beat] Traceback (most recent call last):
[2010-12-16 09:18:13,259: WARNING/Beat] File "/usr/local/lib/python2.7/multiprocessing/process.py", line 232, in _bootstrap
[2010-12-16 09:18:13,284: WARNING/Beat] self.run()
[2010-12-16 09:18:13,285: WARNING/Beat] File "/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/beat.py",
line 392, in run
[2010-12-16 09:18:13,291: WARNING/Beat] self.service.start(embedded_process=True)
[2010-12-16 09:18:13,292: WARNING/Beat] File "/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/beat.py",
line 322, in start
[2010-12-16 09:18:13,292: WARNING/Beat] humanize_seconds(self.scheduler.max_interval)))
[2010-12-16 09:18:13,292: WARNING/Beat] File "/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/beat.py",
line 362, in scheduler
[2010-12-16 09:18:13,292: WARNING/Beat] self._scheduler = self.get_scheduler()
[2010-12-16 09:18:13,292: WARNING/Beat] File "/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/beat.py",
line 354, in get_scheduler
[2010-12-16 09:18:13,293: WARNING/Beat] lazy=lazy)
[2010-12-16 09:18:13,293: WARNING/Beat] File "/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/utils/
__init__.py", line 362, in instantiate
[2010-12-16 09:18:13,297: WARNING/Beat] return get_cls_by_name(name)(*args, **kwargs)
[2010-12-16 09:18:13,298: WARNING/Beat] File "/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/beat.py",
line 274, in __init__
[2010-12-16 09:18:13,298: WARNING/Beat] Scheduler.__init__(self, *args, **kwargs)
[2010-12-16 09:18:13,298: WARNING/Beat] File "/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/beat.py",
line 150, in __init__
[2010-12-16 09:18:13,299: WARNING/Beat] self.setup_schedule()
[2010-12-16 09:18:13,299: WARNING/Beat] File "/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/beat.py",
line 279, in setup_schedule
[2010-12-16 09:18:13,299: WARNING/Beat] self.merge_inplace(conf.CELERYBEAT_SCHEDULE)
[2010-12-16 09:18:13,299: WARNING/Beat] File "/usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/beat.py",
line 250, in merge_inplace
[2010-12-16 09:18:13,299: WARNING/Beat] if self.get(key):
[2010-12-16 09:18:13,300: WARNING/Beat] File "/usr/local/lib/python2.7/UserDict.py", line 61, in get
[2010-12-16 09:18:13,310: WARNING/Beat] return self[key]
[2010-12-16 09:18:13,310: WARNING/Beat] File "/usr/local/lib/python2.7/UserDict.py", line 20, in __getitem__
[2010-12-16 09:18:13,310: WARNING/Beat] return self.data[key]
[2010-12-16 09:18:13,311: WARNING/Beat] File "/usr/local/lib/python2.7/shelve.py", line 122, in __getitem__
[2010-12-16 09:18:13,317: WARNING/Beat] value = Unpickler(f).load()
[2010-12-16 09:18:13,318: WARNING/Beat] EOFError
[2010-12-16 09:18:13,318: INFO/Beat] process exiting with exitcode 1
O motivo desse error é que antes de dar start no Celery ele já esta rodando em memoria. Quando rodamos o Celery ele cria alguns arquivos no projeto para gerenciamento de Task, um dele é o celery.dir que guarda informações das function que vai ser processada de X em X tempo.
Bom a solução para esse casa é apagar o arquivo "celery.dir" assim ele zera o task do Celery, quando der start novamente ele recria o "celery.dir".
Agora ele só normal:
[root@xen-01 gonow]# python2.7 manage.py celeryd -v 2 -B -s celery -E -l INFO
[2010-12-16 09:18:28,539: WARNING/MainProcess] celery@xen-01 v2.1.3 is starting.
[2010-12-16 09:18:28,540: WARNING/MainProcess] /usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/apps/
worker.py:107:
UserWarning: Running celeryd with superuser privileges is not encouraged!
"Running celeryd with superuser privileges is not encouraged!")
[2010-12-16 09:18:28,540: WARNING/MainProcess] /usr/local/lib/python2.7/site-packages/celery-2.1.3-py2.7.egg/celery/apps/
worker.py:110:
UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in a production environment!
warnings.warn("Using settings.DEBUG leads to a memory leak, "
[2010-12-16 09:18:28,543: WARNING/MainProcess]
Configuration ->
. broker -> ghettoq.taproot.Database://guest@localhost/
. queues ->
. celery -> exchange:celery (direct) binding:celery
. concurrency -> 2
. loader -> djcelery.loaders.DjangoLoader
. logfile -> [stderr]@INFO
. events -> ON
. beat -> ON
. tasks ->
. gonow.vps.tasks.lvm
[2010-12-16 09:18:28,568: INFO/PoolWorker-2] child process calling self.run()
[2010-12-16 09:18:28,578: INFO/PoolWorker-3] child process calling self.run()
[2010-12-16 09:18:28,591: INFO/Beat] child process calling self.run()
[2010-12-16 09:18:28,593: INFO/Beat] Celerybeat: Starting...
[2010-12-16 09:18:28,596: WARNING/MainProcess] celery@xen-01 has started.
Cron dentro do Django com Celery
19 de Outubro de 2010, 0:00 - Um comentárioOntem na parte da noite conversando com um conhecido ele falou que estava usando em um projeto o Celery, como ainda não conhecia vamos estudar este projeto. Gostei da forma que ele trabalha e como ele integra com o Django. Tenho em um projeto uma fila de processamento só que foi desenvolvido por mim e não tem todos os recursos que o Celery tem.Vou explicar como usar o Celery com o Django em um exemplo simples, e como sempre basta usar a criatividade para desenvolver a sua necessidade.
Primeiramente temos que instalar dois pacotes Python para que possamos trabalhar com o Celery no Django, o django-celery e ghettoq. Caso tenhamos o easy_install instalado basta instalar os pacotes da seguinte forma:
$ easy_install django-celery $ easy_install ghettoq
Caso não tenha vamos instalar:
$ cd /usr/src/ $ git clone http://github.com/ask/django-celery.git $ cd django-celery $ python setup.py build $ python setup.py install $ cd .. $ git clone http://github.com/ask/ghettoq $ cd ghettoq $ python setup.py build $ python setup.py install
Após instalar vamos criar um projeto para que possamos trabalhar com o Celery nele.
$ django-admin.py startproject celerytest $ cd celerytest
Vamos editar o settings.py:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'test', } } ... CARROT_BACKEND = "ghettoq.taproot.Database" INSTALLED_APPS = ( ... 'djcelery', 'ghettoq', )
Após declarar qual biblioteca o projeto em Django vai carregar podemos sincronizar o nosso database:
$ python manage.py syncdb
Temos que criar um arquivo chamado tasks.py, esse arquivo trabalha como o models de uma aplicação:
from celery.task.schedules import crontab from celery.decorators import periodic_task # this will run every minute, see http://celeryproject.org/docs/reference/celery.task.schedules.html#celery.task.schedules.crontab @periodic_task(run_every=crontab(hour="*", minute="*", day_of_week="*")) def test(): print "Tarefa de teste..."
Agora temos que dar start em nosso daemon Celery:
$ python manage.py celeryd -v 2 -B -s celery -E -l INFO 2010-10-19 05:34:44,215: WARNING/MainProcess] celery@program-8 v2.1.1 is starting. [2010-10-19 05:34:44,216: WARNING/MainProcess] /usr/local/lib/python2.6/dist-packages/celery-2.1.1-py2.6.egg/celery/apps/ worker.py:105: UserWarning: Running celeryd with superuser privileges is not encouraged! "Running celeryd with superuser privileges is not encouraged!") [2010-10-19 05:34:44,216: WARNING/MainProcess] /usr/local/lib/python2.6/dist-packages/celery-2.1.1-py2.6.egg/celery/apps/ worker.py:108: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in a production environment! warnings.warn("Using settings.DEBUG leads to a memory leak, " [2010-10-19 05:34:44,222: WARNING/MainProcess] Configuration -> . broker -> ghettoq.taproot.Database://guest@localhost/ . queues -> . celery -> exchange:celery (direct) binding:celery . concurrency -> 2 . loader -> djcelery.loaders.DjangoLoader . logfile -> [stderr]@INFO . events -> ON . beat -> ON . tasks -> . celerytest.lol.tasks.test [2010-10-19 05:34:44,238: INFO/PoolWorker-2] child process calling self.run() [2010-10-19 05:34:44,239: INFO/PoolWorker-3] child process calling self.run() [2010-10-19 05:34:44,241: WARNING/MainProcess] celery@program-8 has started. [2010-10-19 05:34:44,241: INFO/Beat] child process calling self.run() [2010-10-19 05:34:44,241: INFO/Beat] Celerybeat: Starting... [2010-10-19 05:35:00,537: INFO/MainProcess] Got task from broker: celerytest.lol.tasks.test[22d15af7-8fe9-4acd-bdde-06265004eb50] [2010-10-19 05:35:00,760: WARNING/PoolWorker-3] firing test task [2010-10-19 05:35:01,088: INFO/MainProcess] Task celerytest.lol.tasks.test[22d15af7-8fe9-4acd-bdde-06265004eb50] processed: None
Pronto ele esta rodando.
O Celery é um projeto muito bom só que ainda estamos enfrentando alguns bugs com processos pesado o pior que ele para de processar e não esta dando nem um retorno, por isso antes colocar em produção teste sua aplicação onde o Celery vai rodar.
Par ou Ímpar com Python
18 de Outubro de 2010, 0:00 - sem comentários aindaComo vocês viu gosto muito de matemática, então nada melhor de juntar Matemática com Python, um script simples em Python para identificar se o numero digitado é Par ou Ímpar.#!/usr/bin/env python n = raw_input("Numero: ") if n%2==0: print "Par" else: print "Impar"
Não tem muito segredo mas no teste do evento Google Developer Day caiu coisa do tipo.
Identificando dispositivo movel no Django
16 de Outubro de 2010, 0:00 - sem comentários aindaHoje temos uma biblioteca chamada de Bloom Device feira para Django desenvolvida por bishanty e kevin.tom.Como instalar?
$ wget http://django-bloom.googlecode.com/files/bloom-0.1.tar.gz $ tar -tzvf bloom-0.1.tar.gz $ cd django-bloom $ python setup.py install
Antes de instalar esta biblioteca teríamos que fazer da segunte forma:
>>> request.META['HTTP_USER_AGENT'] 'SonyEricssonW850i/R1GB Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1'
E pegar o resultado do HTTP_USER_AGENT e parcia. Com o Bloom Device ele retorna um JSON:
>>> request.device {u'mobileDevice': '1', u'displayWidth': '240', u'displayHeight': '320', u'vendor': 'Sony Ericsson', u'model': 'W850i', ...}
Como usar no Django?
Depois de instalado temos que instanciar o Bloom Device no Django no settings.py:
INSTALLED_APPS = ( ... 'bloom.device', ... ) ... MIDDLEWARE_CLASSES = ( ... 'bloom.device.middleware.DeviceDetectMiddleware', ... )
Na views da aplicação vamos usar assim:
@detect_device from bloom.device.decorators import detect_device def my_view(request): print request.device ...
Agora vai a criatividade para poder trabalhar com o Bloom Device.
Recomendações
Calculo de Bhaskara via Python
15 de Outubro de 2010, 0:00 - sem comentários aindaO foco este post é levar você aprender computação com Python. Para calcular as raízes em função do segundo grau, utilizamos uma fórmula muito querida por todos que estudam no ensino médio, a famosa fórmula de Bhaskara:
import math
import sys
a=input ("a:")
b=input ("b:")
c=input ("c:")
d=(b^2)-(4*a*c) #Mário Meyer
# d=((b^2)-4*a)*c Esta errado esta linha, usar a linha superior.
if d<0 :
print ("Delta negativo, raiz impossivel de ser extraida.")
sys.exit()
else : print "Delta: %s." % d
m1=math.sqrt(d)
x1=(-b+m1)/(2*a)
x2=(-b-m1)/(2*a)
print "Raiz ~ X1= %s." % x1
print "Raiz ~ X2= %s." % x2
Oportunidade Python - UPX
14 de Outubro de 2010, 0:00 - sem comentários aindaEmpresa de Alphaville (São Paulo) procura DOIS programadores Python para trabalharem presencialmente desenvolvendo em framework Django. Contratação imediata. Características obrigatórias:- Fluência em Python e Django.
- Fluência em inglês escrito.
- Disponibilidade para trabalhar das 9h às 18h em Alphaville.
- Ser usuário GNU Linux.
- Noções de Mercurial.
- Experiência com Webservices.
- Noções de Google AppEngine.
Gerando SVG com Python
11 de Outubro de 2010, 0:00 - sem comentários aindaEm baixo veja um código de como gerar SVG com Pythonimport os display_prog = 'display' class Scene: def __init__(self,name="svg",height=400,width=400): self.name = name self.items = [] self.height = height self.width = width return def add(self,item): self.items.append(item) def strarray(self): var = ["\n", "\n" % (self.height,self.width), " \n"] for item in self.items: var += item.strarray() var += [" \n\n"] return var def write_svg(self,filename=None): if filename: self.svgname = filename else: self.svgname = self.name + ".svg" file = open(self.svgname,'w') file.writelines(self.strarray()) file.close() return def display(self,prog=display_prog): os.system("%s %s" % (prog,self.svgname)) return class Line: def __init__(self,start,end): self.start = start #xy tuple self.end = end #xy tuple return def strarray(self): return [" \n" %\ (self.start[0],self.start[1],self.end[0],self.end[1])] class Circle: def __init__(self,center,radius,color): self.center = center #xy tuple self.radius = radius #xy tuple self.color = color #rgb tuple in range(0,256) return def strarray(self): return [" \n" % colorstr(self.color)] class Rectangle: def __init__(self,origin,height,width,color): self.origin = origin self.height = height self.width = width self.color = color return def strarray(self): return [" \n" %\ (self.width,colorstr(self.color))] class Text: def __init__(self,origin,text,size=24): self.origin = origin self.text = text self.size = size return def strarray(self): return [" \n" %\ (self.origin[0],self.origin[1],self.size), " %s\n" % self.text, " \n"] def colorstr(rgb): return "#%x%x%x" % (rgb[0]/16,rgb[1]/16,rgb[2]/16) def main(): scene = Scene('test') scene.add(Rectangle((100,100),200,200,(0,255,255))) scene.add(Line((200,200),(200,300))) scene.add(Line((200,200),(300,200))) scene.add(Line((200,200),(100,200))) scene.add(Line((200,200),(200,100))) scene.add(Circle((200,200),30,(0,0,255))) scene.add(Circle((200,300),30,(0,255,0))) scene.add(Circle((300,200),30,(255,0,0))) scene.add(Circle((100,200),30,(255,255,0))) scene.add(Circle((200,100),30,(255,0,255))) scene.add(Text((50,50),"Thiago Avelino gerando SVG com Python")) scene.write_svg() scene.display() return if __name__ == '__main__': main()
Repositório para linguagem Python - PyPI
10 de Outubro de 2010, 0:00 - sem comentários aindaPyPI (Python Package Index) é um repositório para linguagem Python. Hoje temos 11.559 software no repositório.
Caso você use PyPI e ache um erro basta reporta o BUG para o Support Requests.
Você tem uma aplicação e acha que a mesma pode ajudar outras pessoas você pode colocar a sua aplicação no PyPI, basta ler como reporta a aplicação aqui.
Django Lock 1.0 - Gnome Look
23 de Setembro de 2010, 0:00 - sem comentários aindaTema para Gnome com cara de Django