1. 简单说一下你对同步和异步的理解?
同步:同步是指一个进程在执行某个请求的时候,如果该请求需要一段时间才能返回信息,那么这个进程会一直等待下去,直到收到返回信息才继续执行下去。
异步:异步是指进程不需要一直等待下去,而是继续执行下面的操作,不管其他进程的状态,当有信息返回的时候会通知进程进行处理,这样就可以提高执行的效率了,即异步是我们发出的一个请求,该请求会在后台自动发出并获取数据,然后对数据进行处理,在此过程中,我们可以继续做其他操作,不管它怎么发出请求,不关心它怎么处理数据。
2. 简单说一下Celery的工作流程?
1、客户端发布任务
2、发布的任务存到任务队列里面,可以以redis、rabbitMQ、MessageQueue、MySQL存储,一般在django/flask程序里redis居多
3、任务处理者会不断从任务队列里面获取任务执行
3. 如何安装celery和eventlet模块?
pip install -U celery -i https://pypi.douban.com/simple
celery -A ihome.tasks.task_sms worker –l info -P eventlet
4. 如何在单一文件中编写celery异步任务处理代码?
// from celery import Celery
from ihome.libs.yuntongxun.sms import CPP
# 定义celery对象,ihome是celery的名字,根据业务场景而定,当前做的是爱家租房,所以是ihome
# broker="redis://127.0.0.1:6379/1":指定消息中间人的链接地址
celery_app = Celery("ihome", broker="redis://127.0.0.1:6379/1")
@celery_app.task
def send_sms(to,datas,temp_id):
"""发送短信的异步任务"""
cpp = CPP()
# 发送短信后没有处理返回值问题,因此待会儿会返回None
cpp.send_message(temp_id, to, datas)
5. 如何使用客户端向消息队列中发送异步任务?
调用自己编写异步任务的函数名.delay
6. 如何在异步任务的发送方获取异步任务执行的返回结果?
// 返回的是异步执行结果对象
result = send_sms.delay(mobile, [sms_code, int(constants.SMS_CODE_REDIS_EXPIRES / 60)], 1)
print("result=", result, "result.id=", result.id)
# 通过get()方法能够捕获celery异步执行的结果
# get()方法默认是阻塞行为,会等到有了执行结果后才返回
# get()方法也接受参数timeout,表示超时时间,如果时间到了还没有得到返回结果则报连接超时异常
ret = result.get(timeout=10)
print("ret=", ret)