在Ubuntu系统中,实现分布式定时任务的常见方法是使用分布式任务队列。这里推荐使用Celery,它是一个基于Python的分布式任务队列库,可以轻松实现分布式定时任务。
以下是在Ubuntu上使用Celery实现分布式定时任务的步骤:
pip install celery
在项目目录中创建一个名为celery_app.py的文件,并在其中创建一个Celery实例:
from celery import Celery
app = Celery('tasks', broker='pyamqp://guest@localhost//')
@app.task
def add(x, y):
return x + y
这里,我们使用RabbitMQ作为消息代理(broker)。确保已安装并运行RabbitMQ服务器。
在celery_app.py文件中,添加以下代码以定义定时任务:
from celery.schedules import crontab
app.conf.beat_schedule = {
'add-every-30-seconds': {
'task': 'tasks.add',
'schedule': 30.0,
'args': (10, 20)
},
}
这里,我们定义了一个名为add-every-30-seconds的定时任务,它将每30秒执行一次add函数。
在项目目录中,运行以下命令启动Celery worker:
celery -A celery_app worker --loglevel=info
在另一个终端窗口中,运行以下命令启动Celery beat,它将负责调度定时任务:
celery -A celery_app beat --loglevel=info
现在,定时任务将在所有运行Celery worker的节点上分布式执行。
注意:在实际生产环境中,建议使用更健壮的消息代理(如RabbitMQ或Redis)和结果后端(如Redis或Memcached)。同时,确保对任务进行异常处理和日志记录。