当前位置: 首页 > 后端技术 > Python

celery学习笔记整理4个模块近30页(第一期)

时间:2023-03-25 22:04:53 Python

celery学习笔记整理4个模块近30页第一期今天带来第一期的celery相关知识,后续文章陆续发布慢慢完成笔记地址:celery学习笔记整理4个模块近30页(第一期)-知乎(zhihu.com)1.抛出的问题。我们在做网站后台程序开发的时候,会遇到这样的需求:用户我们需要在我们的网站上填写注册信息,我们给用户发一封注册激活邮件到用户邮箱。如果由于各种原因,发送此邮件的时间较长,客户端会等待很长时间,造成用户体验不好。那么如何解决此类问题呢?我们把耗时的任务放在后台异步执行。不会影响用户的其他操作。除了注册功能,上传、图形处理等耗时的工作,都可以通过这种方式解决。如何实现异步任务执行?我们可以用芹菜。除了刚刚提到的异步执行任务,celery还可以实现某些任务的定时处理。celery简介Celery是一个功能齐全的即插即用任务队列。它使我们不需要考虑复杂的问题,而且使用起来非常简单。芹菜看起来很大。在本章中,我们将首先对其进行简单的了解,然后再学习一些其他的高级特性。Celery适用于异步处理问题。在发送邮件,或者上传文件、图片处理等耗时操作时,我们可以异步执行,让用户无需长时间等待,提升用户体验。celery的特点是:简单、易于使用和维护、文档丰富。高效,单个celery进程每分钟可以处理数百万个任务。灵活,几乎celery的每个部分都可以定制和扩展。Celery很容易集成到一些Web开发框架中。任务队列是一种跨线程和跨机器工作的机制。任务队列包含称为任务的工作单元。有一个专门的工作进程不断地监视任务队列,并从中获取新的任务并进行处理。Celery通过消息进行通信,通常使用Broker(中间人)来协调client(任务发布者)和worker(任务处理者)。Client向队列发送消息,Broker将队列中的信息分发给Worker进行处理。一个celery系统可以包含很多worker和broker,这样可以增强横向扩展性和高可用性。我们可以使用python的包管理器pip来安装:pipinstall-UCelery也可以直接从官网下载安装包:https://pypi.python.org/pypi/...tarxvfzcelery-0.0.0。tar.gzcdcelery-0.0.0pythonsetup.pybuildpythonsetup.pyinstallCelery需要一种发送和接收消息的方法。我们称这种存储消息的中间设备为消息代理,或者消息代理。作为中介,我们有几种选择:1.RabbitMQRabbitMQ是一个功能齐全、稳定且易于安装的代理。它是生产环境中的最佳选择。关于RabbitMQ的详细使用,参考以下链接:http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html#broker-rabbitmq如果我们使用的是Ubuntu或者Debian发行版的Linux,我们可以直接使用以下命令安装RabbitMQ:sudoapt-getinstallrabbitmq-server安装完成后,RabbitMQ-server服务器已经在后台运行。如果您使用的不是Ubuntu或Debian,您可以在以下网站找到您需要的版本软件:http://www.rabbitmq.com/downl...2.RedisRedis也是一个功能齐全的代理选项,但它更有可能因意外中断或断电而导致数据丢失。关于将Redis作为Broker,可以访问以下网站:http://docs.celeryproject.org/en/latest/getting-started/brokers/redis.html#broker-redis使用celery首先要做的是themostimportant最重要的是你需要先创建一个Celery实例,我们一般称之为celeryapplication,或者更简单的说,app。app应用是我们使用celery所有功能的入口,比如创建任务,管理任务等。使用celery时,app必须能够被其他模块导入。1.创建应用我们首先创建tasks.py模块,它的内容是:fromceleryimportCelery#在我们的例子中,redis被用作brokerapp=Celery('demo',broker='redis://:332572@127.0.0.1/1')#创建一个任务函数@app.taskdefmy_task():print("Thetaskfunctionisexecuting....")Celery第一个参数是给它设置一个名字,第二个参数我们设置了一个中间人broker,这里我们使用Redis作为中间人。my_task函数是我们写的任务函数,通过添加装饰器app.task注册到broker的队列中。现在我们正在创建一个worker,等待处理队列中的任务。打开终端,cd到tasks.py同级目录,执行命令:celery-Atasksworker--loglevel=info显示效果如下:2.调用task任务加入到broker队列中,这样我们刚刚创建的celeryworkerserver就可以从队列中取出任务并执行了。如何将任务函数添加到队列中,可以使用delay()。进入python终端,执行如下代码:fromtasksimportmy_taskmy_task.delay()执行效果如下:我们可以通过worker控制台看到我们的任务是被worker处理的。调用任务函数会返回一个AsyncResult对象,可以用来查看任务的状态或者获取任务的返回值。3.存储结果如果我们想跟踪任务的状态,Celery需要将结果保存在某个地方。有几个可用的存储选项:SQLAlchemy、DjangoORM、Memcached、Redis、RPC(RabbitMQ/AMQP)。比如我们仍然使用Redis作为存储结果的方案,我们通过Celery的后端参数设置任务结果存储配置。我们修改任务模块如下:fromceleryimportCelery#在我们的例子中,redis被用作brokerapp=Celery('demo',backend='redis://:332572@127.0.0.1:6379/2',broker='redis://:332572@127.0.0.1:6379/1')#创建任务函数@app.taskdefmy_task(a,b):print("任务函数正在执行....")returna+b我们给Celery添加指定backend参数,指定redis作为结果存储,task函数修改为两个参数,有返回值。关于结果对象的更多信息,请参考以下网址:http://docs.celeryproject.org/en/latest/reference/celery.result.html#module-celery.result____Celery易于使用且非常简单配置。Celery有很多配置选项可以让celery满足我们的需求,但是默认的配置对于大部分的应用场景来说已经足够了。配置信息可以直接在APP中设置,也可以通过专有的配置模块进行配置。1.直接通过app配置fromceleryimportCeleryapp=Celery('demo')#添加配置app.conf.update(result_backend='redis://:332572@127.0.0.1:6379/2',broker_url='redis://:332572@127.0.0.1:6379/1',)2.专有配置文件对于比较大的项目,我们建议将配置信息作为单独的模块。我们可以通过调用app函数告诉Celery使用我们的配置模块。配置模块的名称叫做celeryconfig。这个名字不是固定的。我们可以任意命名。建议这样做。我们必须确保可以导入配置模块。配置模块的名称叫做celeryconfig。这个名字不是固定的。我们可以任意命名。建议这样做。我们必须确保可以导入配置模块。接下来,我们在与tasks.py模块相同的目录中创建配置模块celeryconfig.py:result_backend='redis://:332572@127.0.0.1:6379/2'broker_url='redis://:332572@127.0.0.1:6379/1'tasks.py文件修改为:fromceleryimportCeleryimportceleryconfig#在我们的例子中,redis用作brokerapp=Celery('demo')#从单独的配置模块加载配置app.config_from_object('celeryconfig')更多配置:http://docs.celeryproject.org...____