当前位置: 首页 - 智能 - 逆天异步神器-celery Python面试占90你了解多少

逆天异步神器-celery Python面试占90你了解多少

2024-12-15 智能 0

逆天异步神器-celery Python面试占90%你了解多少?

celery是什么,有什么用?

对于celery,各种文件解释一堆,可以自己看下,根据日常互动,公众号使用者小白居多,官方用到的很多名词可能你理解起来不是那么容易,我这里就不照本宣科了,就以我这边的理解简单以下方图示解释下,如果有误,欢迎指正:

首先理解一个概念:阻塞

理解阻塞,先从耗时操作讲起,常见的场景比如使用者输入、等待(sleep)这些都属于,具体到实际专案中比如说发邮件、发简讯、机器/深度学习训练模型、自动化测试中的各种操作流程等待都会产生耗时,耗时操作通常我们也会称之为阻塞,意思就是程式一行一行程式码执行,你这些耗时操作没执行完毕,后面的程式码就不会执行,阻塞了后面的程式码执行

理解了阻塞以后,就很容易引出一个问题?我如果想提高程式执行效率不让程式阻塞,那该怎么办?有没有一种方式,能在程式阻塞的时候,不影响我后面程式码的执行?

一般来说,我们可以用执行绪、程序、协程,都是可以实现的,只不过在实际专案中,有成熟开源并且广泛应用的的东西,我们会用框架,而不去手写多执行绪、程序、协程,也不是说这些不用去学,这是程式设计的基本知识,也是必须掌握的,很能体现程式设计基本功底

celery基本原理:

1、客户端也就是python(django/flask等)释出任务

2、释出的任务存到任务伫列里面,可以以redis、rabbitMQ、MessageQueue、MySQL储存,一般在django/flask程式里redis居多

3、任务处理者会不断从任务伫列里面获取任务执行

1、安装django/celery库

django==2.0.6

celery==3.1.26

django-celery==3.3.0

redis==2.10.6

都用pip安装,我这边这几个版本测试没问题,版本有些时候不相容,如果报错,网上找下解决

2、redis数据库安装

redis安装:http://www.python88.cn/book/redis10/

注意以下几点:

1、redis.conf改bind127.0.0.1为bind 真实ip,这样可以远端访问

2、如果是阿里云服务器,需要在控制台将6379埠开放

3、redis启动服务端:redis-server,启动客户端:redis-cli

3、演示程式码demo

整体流程是在前面页面点选表格里面的执行,会用selenium开启浏览器,执行耗时操作,相当于每个执行都是一个单独耗时任务

4、demo前端程式码:

给按钮系结run_case2方法,获取当前表格行号(对映要用selenium开启的网站链接),作为引数传到后端

function run_case2(obj){

row_tr = obj.parentNode.parentNode.rowIndex;//获取当前行数

console.log(row_tr);

param = {url:row_tr};

$.post(\/web/yzm/\, param, function (data) {

console.log(data.result)

})

}

5、demo后端程式码:(阻塞写法)

看下面程式码,前端传的行号,我这只是为了测试传引数,随便构造的,分别跟3个网址进行对映,对于下面的这种写法,就是典型的阻塞执行绪,webdriver在执行的时候,只有当把quit关闭浏览器执行完毕时候,才会return返回结果并在控制台打印success,如下图演示,我点选的是第三个执行按钮

from selenium import webdriver

import time

@csrf_exempt

@login_required

def yzm(request):

url_num = request.POST.get(url)

if int(url_num)==1:

url_str = https://www.baidu.com

elif int(url_num==2:

url_str = http://www.python66.cn

elif int(url_num)==3:

url_str = http://www.python88.cn

print(url_num,url_str)

# 下面webdriver开启网站,并休眠5秒钟都是耗时任务

driver = webdriver.Chrome(executable_path=C:chromedriver_win32chromedriver.exe)

driver.get(url_str)

time.sleep(5)

driver.quit

# 耗时任务执行完毕开始return

return JsonResponse({result: success})

6、demo后端程式码:(celery异步)

异步:名字虽然为异步,你可以理解为同步,就是一边做耗时操作,一般执行后面程式码,两者同时执行

档案目录,我在专案目录下面建立了celery_task包,建立tasks.py档案

1、建立app,代表一个celery物件,broker代表队列,用的redis 0号数据库。

2、然后将上一步我们selenium开启浏览器的方法封装成open_url方法。

3、@app.task代表定义任务,指明这个open_url方法是一个任务,可以在视图里面呼叫释出。

from celery import Celery

from selenium import webdriver

import time

# 建立celery的应用

app = Celery(celery_task, broker=redis://47.101.203.45:6379/0)

@app.task

def open_url(url):

driver = webdriver.Chrome(executable_path=C:chromedriver_win32chromedriver.exe)

driver.get(url)

time.sleep(5)

driver.quit

views.py视图里面这样写

1、from celery_task.tasks import open_url为汇入任务

2、open_url.delay(url_str)为释出任务,其中delay里面可以传引数,你前端传过来的引数views.py检视函式接收,可以再传到celery任务中去

效果图如下:当点选执行时候,return的success很快就返回并打印了,跟控浏览器的过程没一点牵涉,无需等待selenium,这样就实现了非阻塞异步,完美解决了耗时问题

from celery_task.tasks import open_url

@csrf_exempt

@login_required

def yzm2(request):

url_num = request.POST.get(url)

if int(url_num)==1:

url_str = https://www.baidu.com

elif int(url_num)==2:

url_str = http://www.python66.cn

elif int(url_num)==3:

url_str = http://www.python88.cn

print(url_num,url_str)

open_url.delay(url_str)

return JsonResponse({result:success})

7、多个任务同时执行

对于多个任务同时执行,我这里连续点选三个执行按钮,立马先打印了3个success,说明3个任务都被celery异步处理了,对于多工的引数问题,上面也说了,我们在delay里面传入引数即可,传到定义任务的tasks.py档案里面的对于方法中去,本例中我演示的是传了一个url_str引数

8、启动程式

开启两个终端,都切换到专案目录下面

1、先启动celery:

celery -A celery_task.tasks worker -l info

2、再启动django:

python manage.py runserver

本文重要的是理解原理,celery的远不止于此,有兴趣可以看看在爬虫、机器学习、深度学习领域的使用,会对celery的使用场景有更清晰的认识。

小编整理了一套完整的架构资料和面试文件希望可以帮到到大家,转发收藏+新增小编微信(qiqilaije)

获取方式:新增小编微信(qiqilaije)获取自学教程一套。

标签: 智能家居系统有哪些模块全国智能家居哪个好全屋智能装修智能汽车智能家居加盟

上一篇:数字货币与金融体系改革未来的经济形态演变

下一篇:探索未来前沿科技2023的奇迹与机遇

相关推荐
推荐资讯
热门文章