Ir para o conteúdo
ou

Software livre Brasil

Tela cheia
 Feed RSS

Thiago Avelino

27 de Maio de 2009, 0:00 , por Software Livre Brasil - | Ninguém está seguindo este artigo ainda.

Problema com Celery "process exiting with exitcode 1"

16 de Dezembro de 2010, 0:00, por Software Livre Brasil - 0sem 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, por Software Livre Brasil - 1Um 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, por Software Livre Brasil - 0sem 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, por Software Livre Brasil - 0sem 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, por Software Livre Brasil - 0sem 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:
Onde cada letra desta fórmula representa os coeficientes da função do segundo grau que queremos resolver. Basta substituir e achar os valores. Podem notar que há um ± no meio da fórmula. Pois é, é daí que irá sair dois resultados: um com o sinal de + e outro com o sinal de -. Veja o exemplo: Neste exemplo temos os coeficientes, a=2, b= -6 e c= -20 (Muita atenção para os sinais) Agora substituindo na fórmula de Bhaskara: Agora chegamos no momento crucial do cáculo das raízes. Devemos separar esta conta em duas: uma com o sinal de + e a outra com o sinal de -. Assim: Portanto as duas raízes da função são 5 e -2. Chega de blablabla e vamos ver como isso fica em Python:

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, por Software Livre Brasil - 0sem 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.
Características desejáveis:
  • Ser usuário GNU Linux.
  • Noções de Mercurial.
  • Experiência com Webservices.
  • Noções de Google AppEngine.
A faixa salarial é de ~ R$ 5.000,00. Os currículos (ou portfólios) devem ser enviados em para thiago.ayub AT upx DOT com DOT br




Gerando SVG com Python

11 de Outubro de 2010, 0:00, por Software Livre Brasil - 0sem comentários aindaEm baixo veja um código de como gerar SVG com Python
import 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, por Software Livre Brasil - 0sem comentários ainda

PyPI (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.

Veja todas as aplicações



Django Lock 1.0 - Gnome Look

23 de Setembro de 2010, 0:00, por Software Livre Brasil - 0sem comentários ainda

Tema para Gnome com cara de Django

image0

image1



O blog do Google Brasil: Google Developer Day 2010 - São Paulo, Brasil - Inscrições Abertas!

15 de Setembro de 2010, 0:00, por Software Livre Brasil - 0sem comentários ainda

O blog do Google Brasil: Google Developer Day 2010 - São Paulo, Brasil - Inscrições Abertas!



Tags deste artigo: tecnologia software livre python django mongodb nosql