Celery(芹菜)是使用python编写的任务队列工具。一个中间人会向Celery发送消息,通知它执行任务。这个中间人(Broker经纪人)被称为消息队列(Message Queue)

命令:
pip install Celery

pip install Flask-Celery-Helper

下载RabbitMQ
Celery 和 Redis 入门

rabbitmq-server 账户名:guest;密码:guest

celery worker -A celery_runner --loglevel=info

eta:estimated time of arrival 预计到达时间

签名 signature,功能与子任务subtask一样,生成一个函数,可以把它传给其他函数。如果直接执行这个签名,则在当前进程执行。

from celery import signature
from webapp.tasks import multiply
signature('webapp.tasks.multiply',args=(4,4),countdown=10)
# is equally to
multiply.subtask((4,4),countdown=10)

...webapp.tasks.multiply(4,4)

偏函数 partial,接收多个参数的函数,先接收一部分参数,作为一个新函数,这个新函数只需接收剩下的函数。

datetime.timedelta(seconds=30) ??

celery -A celery_runner beat
from celery.schedules import crontab
crontab(minute=0, hour=0)
crontab(minute=0, hour=[5, 10, 15, 20])
crontab(minute='*/30')
crontab(day_of_week=1, hour = '*/2, 1')

pip install flower
celery flower -A celery_runner --loglevel=info

关于python的strrepr


如果没有加repr,直接输入p时就会返回

<main.Person object at 0x10c941890>

repr and str

关于python的call()


引用自:python特殊函数 call()

所有的函数都是可调用对象。

一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法call()。

我们把 Person 类变成一个可调用对象:

class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

    def __call__(self, friend):
        print 'My name is %s...' % self.name
        print 'My friend is %s...' % friend

现在可以对 Person 实例直接调用:

>>> p = Person('Bob', 'male')
>>> p('Tim')
My name is Bob...
My friend is Tim...

单看 p('Tim') 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。