91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django怎么實現異步任務

發布時間:2021-08-21 11:57:47 來源:億速云 閱讀:808 作者:chen 欄目:web開發

本篇內容介紹了“Django怎么實現異步任務”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

對于網站來說,給用戶一個較好的體驗是很重要的事情,其中最重要的指標就是網站的瀏覽速度。因此服務端要從各個方面對網站性能進行優化,比如可采用CDN加載一些公共靜態文件,如js和css;合并css或者js從而減少靜態文件的請求等等…..還有一種方法是將一些不需要立即返回給用戶,可以異步執行的任務交給后臺處理,以防網絡阻塞,減小響應時間。看了the5fire的博客之后我受到了啟發,決定從這方面進行改進。

我采用celery實現后臺異步執行的需求。對于celery,先看一下網上給的celery的定義和用途:

Celery is a simple, flexible, and reliable distributed system to process vast amounts of messages, while providing operations with the tools required to maintain such a system.

 

It’s a task queue with focus on real-time processing, while also supporting task scheduling.

 

Celery has a large and diverse community of users and contributors, you should come join us on IRC or our mailing-list.

上面的英文還是比較好理解的,簡而言之,就是一個專注于實時處理和任務調度的分布式隊列。

我買了一本《Python Web開發實戰》,那里面也介紹了celery。說了使用celery的常見場景:

  1. Web應用。當用戶觸發一個動作需要較長時間來執行完成時,可以把它作為任務交給celery異步執行,執行完再返回給用戶。這點和你在前端使用ajax實現異步加載有異曲同工之妙。

  2. 定時任務。假設有多臺服務器,多個任務,定時任務的管理是很困難的,你要在不同電腦上寫不同的crontab,而且還不好管理。Celery可以幫助我們快速在不同的機器設定不同任務。

  3. 其他可以異步執行的任務。比如發送短信,郵件,推送消息,清理/設置緩存等。這點還是比較有用的。

綜上所述,第1點和第3點的用途是我考慮celery的原因。目前,考慮在Django中實現兩個功能:

  1. 文章閱讀量的統計

  2. 發送郵件

關于文章閱讀量的統計,我之前的做法就是在用戶每一次訪問文章的時候,都會同步執行一遍+1的函數,現在打算用異步執行的方式。

下面介紹在Django中的使用方法:

1、環境準備

安裝celery,rabbitmq,django-celery.

2、啟動消息中間件rabbitmq。
用它的原因是celery官方推薦的就是它,也可以用Redis等,但Redis會因為斷電的原因造成數據全部丟失等問題。

讓其在后臺運行:

sudo rabbitmq-server -detached

3、在Django中配置(源代碼)

項目代碼結構

dailyblog

 

    ├── blog

│   ├── models.py

│   ├── serializer.py

│   ├── tasks.py

│   ├── urls.py

│   ├── views.py

├── config.yaml

├── dailyblog

│   ├── celery.py

│   ├── __init__.py

│   ├── __init__.pyc

│   ├── settings.py

│   ├── urls.py

│   ├── wsgi.py

對于celery的配置,需要編寫幾個文件:

  1、dailyblog/celery.py

 

  2、dailyblog/settings.py

 

  3、blog/tasks.py

 

  4、dailyblog/__init__.py

1、dailyblog/celery.py

本模塊主要是創建了celery應用,配置來自django的settings文件。

from __future__ import absolute_import,unicode_literals #目的是拒絕隱士引入,celery.py和celery沖突。

import os

from celery import Celery

from django.conf import settings

 

 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dailyblog.settings")

 

#創建celery應用

app = Celery('dailyblog')

#You can pass the object directly here, but using a string is better since then the worker doesn’t have to serialize the object.

app.config_from_object('django.conf:settings')

#如果在工程的應用中創建了tasks.py模塊,那么Celery應用就會自動去檢索創建的任務。比如你添加了一個任務,在django中會實時地檢索出來。

app.autodiscover_tasks(lambda :settings.INSTALLED_APPS)

關于config_from_object,我對于如何加載配置文件還是比較感興趣的,于是研究了一下源碼,具體可以見:“celery加載配置文件”。

2、settings.py

配置celery,

import djcelery

djcelery.setup_loader()

 

 

#末尾添加

CELERYBEAT_SCHEDULER = ‘djcelery.schedulers.DatabaseScheduler‘  # 這是使用了django-celery默認的數據庫調度模型,任務執行周期都被存在你指定的orm數據庫中

 

#INstalled_apps

     INSTALLED_APPS = (

    ‘django.contrib.admin‘,

    ‘django.contrib.auth‘,

    ‘django.contrib.contenttypes‘,

    ‘django.contrib.sessions‘,

    ‘django.contrib.messages‘,

    ‘django.contrib.staticfiles‘,

    ‘djcelery‘,    #### 這里增加了djcelery 也就是為了在django admin里面可一直接配置和查看celery

    ‘blog‘,     ###

)

setup_loader目的是設定celery的加載器,源碼:

  def setup_loader():  # noqa

    os.environ.setdefault(

        b'CELERY_LOADER', b'djcelery.loaders.DjangoLoader',

    )

3、dailyblog/init.py

from __future__ import absolute_import

 

# This will make sure the app is always imported when

# Django starts so that shared_task will use this app.

from .celery import app as celery_app

4、blog/tasks.py

from django.db.models import F

 

from .models import Article

from dailyblog import celery_app

 

 

@celery_app.task

def incr_readtimes(article_id):

    return Article.objects.filter(id=article_id).update(read_times=F('read_times') + 1)

這里面添加了一個任務。任務可以通過delay方法執行,也可以周期性地執行。

1

2

<td class="crayon-code" ">

supervisorctl start celery

1

2

3

4

5

6

7

1

2

3

4

5

6

7

8

9

10

1

至此,通過celery異步執行任務的程序寫完了。除此之外,還可以寫很多的異步任務,發郵件就是非常典型的一種。

“Django怎么實現異步任務”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丹凤县| 民权县| 玉屏| 井陉县| 桦甸市| 桐柏县| 垦利县| 东明县| 宣化县| 蒲城县| 东山县| 靖边县| 兰西县| 剑川县| 大名县| 新乡县| 托里县| 吉水县| 宁河县| 长汀县| 江达县| 赞皇县| 获嘉县| 罗田县| 巴青县| 礼泉县| 镇安县| 同仁县| 航空| 栾城县| 三穗县| 云南省| 格尔木市| 安塞县| 永仁县| 沈丘县| 且末县| 奉化市| 建水县| 尚义县| 蓝山县|