面试题答案
一键面试整体设计思路
- 技术框架选择:可以选择Celery作为分布式任务调度框架。Celery是一个简单、灵活且可靠的分布式任务队列,它支持多种消息代理(如RabbitMQ、Redis等),能够方便地实现任务的异步处理和分布式调度。
- 节点间通信:利用消息代理(如RabbitMQ)作为中介,各个节点(Worker)通过与消息代理进行交互来接收和发送任务消息。任务生产者将任务发送到消息代理的队列中,而Worker从队列中获取任务并执行。
- 任务分配:Celery采用了基于队列的任务分配机制。任务生产者将任务发送到指定的队列,Worker节点可以配置监听一个或多个队列。Celery会根据Worker的负载情况,自动将队列中的任务分配给合适的Worker执行。
- 状态同步:Celery提供了结果后端(Result Backend)来存储任务的执行结果和状态。常用的结果后端有Redis、Django ORM等。任务执行完成后,Worker会将任务结果发送到结果后端,任务生产者或其他节点可以从结果后端获取任务状态和结果。
关键部分Python代码示例
- 安装必要的库:
pip install celery[redis]
- 配置Celery:
from celery import Celery
# 创建Celery实例
app = Celery('tasks', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0')
# 配置任务
@app.task
def add(x, y):
return x + y
代码解释:
from celery import Celery
:导入Celery模块。app = Celery('tasks', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0')
:创建一个名为tasks
的Celery实例,指定消息代理(broker)和结果后端(backend)为本地Redis服务器。@app.task
:装饰器,将add
函数标记为一个Celery任务。
- 启动Worker: 在终端中运行以下命令启动Worker:
celery -A tasks worker --loglevel=info
- 调用任务:
# 导入任务
from tasks import add
# 异步调用任务
result = add.delay(4, 4)
# 获取任务结果
print(result.get())
代码解释:
from tasks import add
:从tasks
模块中导入add
任务。result = add.delay(4, 4)
:异步调用add
任务,delay
方法会立即返回一个AsyncResult
对象,任务会在后台由Worker执行。print(result.get())
:获取任务的执行结果。如果任务还未完成,get
方法会阻塞等待任务完成。
通过以上设计思路和代码示例,可以将单机版本的Python任务调度器扩展为分布式任务调度器,实现多台机器上的协同工作。