django-celery定時任務以及異步任務and服務器部署并且運行全部過程

Celery

應用Celery之前,我想大家都已經了解了,什么是Celery,Celery可以做什么,等等一些關于Celery的問題,在這里我就不一一解釋了。

應用之前,要確保環境中添加了Celery包。

pip install celery
pip install dajngo-celery

安裝完成之后我們還需要安裝,Redis or RabbitMQ 需要用到它們來建立消息隊列來完成收,發任務。

RabbitMQ用戶手冊:

https://www.rabbitmq.com/manpages.html

Redis中文官網:

http://www.redis.cn/

用以上兩種作為消息處理隊列都可以,今天我們來使用Redis來作為隊列。

本人是用Windows來測試,后邊有Linux安裝方法。

下載安裝包鏈接:?https://github.com/MSOpenTech/redis

打開鏈接之后,出現如下頁面,然后點擊? ? ?releases

進入到下載頁面之后,找到需要下載的版本,測試版本(3.0.500)然后點擊版本名稱進入當前版本頁面。

下載之前需要注意的是,紅框中,第一個msi后綴的是微軟格式的安裝包,第二個zip是壓縮包。

下載完成之后,雙擊msi文件。

安裝完成之后,以便從程序后續能夠正常工作,添加訪問密碼,

打開安裝目錄,找到? redis.windows-service.conf 配置文件,用文本編輯器打開,找到 requirepass字樣的地方,添加一行 requirepass 密碼。 這是訪問redis時需要的密碼。一般情況下是可以不用設置的,但是建議還是設置一下。(我用Notepad++打開的)位置:386?

配置完成之后,點擊"開始>右擊"計算機">"管理", 在左側找到"計算機管理(本地)">服務和應用程序>服務,再在右側找到Redis名稱的服務,查看啟動狀態,沒有啟動則手動啟動,一般情況下服務該正常運行了。

Redis服務啟動過程中,報位置錯誤的情況下,解決辦法如下:

1、打開redis安裝目錄找到redis.windows.conf文件拉到底部,添加??maxmemory 209715200

2、添加完成之后保存退出,打開終端,用命令啟動, redis-service.exe redis-windows.conf

3、啟動過程中在報錯,錯誤信息:?

[22420] 11 Oct 11:46:23.351 # Server started, Redis version 3.0.500
[22420] 11 Oct 11:46:23.355 # Can't handle RDB format version 7
[22420] 11 Oct 11:46:23.355 # Fatal error loading the DB: Invalid argument. Exiting.

解決辦法:

刪除所有的dump.rdb文件,重啟新啟動, redis-service.exe文件,報錯原因,可能是rdb文件版本過高或者過低所導致問題出現,

啟動成功界面:

redis啟動成功之后就不要關閉,應為celery是基于redis來收發任務的, 需要用到redis的隊列。

環境到此安裝完成之后,開始寫個簡單的異步任務。

Celery 異步任務

新創建一個Django項目,添加一個應用。

django-admin startproject celery_sq

新建應用

python manage.py startapp app

項目初始化完成之后,打開settings.py文件

一定要將celery導入進去,才可以使用。緊接著導入需要用到的模塊。

from celery.schedules import crontab
from celery.schedules import timedelta
導入

在settings文件拉到底部,添加以下代碼。

import djcelery
djcelery.setup_loader()
BROKER_URL = 'redis://127.0.0.1:6379/'
CELERY_IMPORTS = ('app.tasks')
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
底部添加代碼

以上代碼添加完成之后再同級目錄下創建 celery.py

from __future__ import absolute_import, unicode_literals
# -*- coding: utf-8 -*-
__author__ = 'YongCong Wu'
# @Time    : 2018/10/9 15:52
# @Email   :  : 1922878025@qq.com
import os
from celery import Celery
from django.conf import settings# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celery_sq.settings')app = Celery('celery_sq')# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings')# Load task modules from all registered Django app configs.
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)@app.task(bind=True)
def debug_task(self):print('Request: {0!r}'.format(self.request))
celery.py

在app目錄下添加tasks.py文件, 注意:一個應用下只能添加一個tasks.py 一個py一遍可寫多個任務。

from __future__ import absolute_import
# -*- coding: utf-8 -*-
__author__ = 'YongCong Wu'
# @Time    : 2018/10/9 16:10
# @Email   :  : 1922878025@qq.com
from celery_sq.celery import app@app.task
def add(x, y):return x + y
tasks.py

添加完成之后,在app同級目錄下的views文件里邊添加函數。

from django.shortcuts import render, HttpResponse# Create your views here.
from .tasks import add
import jsondef add_handler(request):x = request.GET.get('x', 1)y = request.GET.get('y', 1)result = add(int(x), int(y))return HttpResponse(json.dumps({'result': result}))
views.py

添加urls.py

# -*- coding: utf-8 -*-
__author__ = 'YongCong Wu'
# @Time    : 2018/10/10 14:46
# @Email   :  : 1922878025@qq.comfrom django.conf.urls import include, url
from django.contrib import admin
from app import viewsurlpatterns = [url(r'^add/', views.add_handler),
]
urls.py

app 中的url添加完成之后需要在celery_sq目錄下的urls.py中添加。

from django.conf.urls import include, url
from django.contrib import adminurlpatterns = [url(r'^admin/', include(admin.site.urls)),url(r'^home/', include('app.urls')),    # 添加這個
]    
celery_sq/urls.py

添加完成之后就開始測試我們的項目,現將項目運行起來。

python manage.pu runserver

項目啟動完成之后,重新打開一個終端,進入項目目錄,啟動django celery 服務。

python manage.py celery worker --loglevel=info

見到這個界面,就說明django celery已經啟動成功了,接下來就開始測試我們的異步任務了。

測試地址端口可自行修改,根據自己端口來設置:? ? http://127.0.0.1:9000/home/add/?x=5&y=5

Celery定時任務

?現在每家公司,有各種各樣的需求,有的需要定時去查找數據等等,一些定時的功能。接下來,我們就用Celery來完成一個定時寫入txt文件的一個任務。

app/tasks.py文件添加以下代碼。

from celery import shared_task@shared_task
def hello_world():with open("output.txt", "a") as f:f.write("hello world")f.write("\n")
tasks.py

在settings.py下添加

CELERYBEAT_SCHEDULE = {  # 定時器策略# 定時任務一: 每隔30s運行一次u'測試定時器1': {"task": "app.tasks.tsend_email",# "schedule": crontab(minute='*/2'),  # or 'schedule':   timedelta(seconds=3),"schedule": timedelta(seconds=30),"args": (),},
}
定時

此時tasks.py文件里邊有一個定時tasks。

參數定義:

days             天
seconds        秒 
microseconds    微秒
milliseconds      毫秒
minutes            分
hours                小時
timedelta參數含義
month_of_year        月份
day_of_month         日期
day_of_week           周
hour                       小時
minute                    分鐘
crontab參數含義

定時任務添加完成之后,啟動celery beat, celery啟動了一個beat進程一直在不斷的判斷是否有任務需要執行。

celery -A celery_sq beat -l info

重新打開終端,輸入以上命令啟動? celery beat, 啟動成功之后看到如下頁面。

任務成功執行之后狀態

  

到此為止,在windows下,測試異步任務和定時任務已經完成,那么有個問題,在windows下執行一下celery需要打開這么多的終端窗口,哪用linux部署項目的時候該怎么辦呢,接下來,我們就在linux下部署。我們用守護進程的方式來完成。

Linux下部署django-celery

Linux默認Python環境是2.7,需要自行下載Pyhton3.5。(安裝過程自行百度)

linux下,我們一般用守護進程的方式來啟動 Celery ,不然總不能在打開很多窗口一個窗口啟動一個beat等等吧。

在linux下使用supervisor來守護進程。

supervisor官網:

http://supervisord.org

安裝Redis:

wget http://download.redis.io/releases/redis-2.8.3.tar.gz

安裝完成之后需要解壓,編譯。依次按照以下命令執行。

tar xzf  redis-2.8.3.tar.gz

cd redis-2.8.3

make && make install

安裝supervisor

pip install supervisor

supervisor配置

我們使用echo_supervisord_conf命令來得到supervisor配置模板,打開終端shell輸入以下命令。

echo_supervisord_conf > supervisord.conf

?

接下來編輯 supervisord.conf文件

vim supervisord.conf

修改include分發ini文件目錄。

配置完成之后創建conf.d目錄

mkdir conf.d

創建完成之后進入目錄,創建ini文件將以下配置寫入文件中。

測試添加ini文件是否讀取。

在任意目錄下創建hello.py文件,添加以下代碼,來進行測試。

import time
import sys
while True:print("test data\n")sys.stdout.flush()time.sleep(1)

添加完成之后保存,用 python 文件名稱 來執行py文件是否出錯。正確結果:

測試完成之后開始為hello.py添加進程守護。

進入conf.d目錄添加 hello.ini文件。將以下配置寫入文件。

[program:hello]        名字隨意,不要重復
command=python /home/hello.py
stdout_Logfile=/home/celery_log/hello.log
stderr_logfile=/home/celery_log/hello_error.log

運行supervisord

supervisord -c /home/supervisor/supervisord.conf

運行hello進程

supervisordctl -c /home/supervisor/supervisord.conf      運行全部supervisordctl -c /home/supervisor/supervisord.conf start heelo     指定運行supervisordctl -c /home/supervisor/supervisord.conf stop heelo     指定停止參數:  start status stop restart         啟動,狀態, 停止, 重啟

以上圖片是啟動成功之后的狀態。

測試完成之后就開始配置Redis。

添加redis.ini文件,將以下內容添加。

[program:redis]
command=/home/redis-4.0.1/src/redis-server
autostart=true
autorestart=true
startsecs=3
stdout_Logfile=/home/celery_Log/redis.log    標準日志輸出
stderr_logfile=/home/celery_log/redis_error.log     錯誤日志輸出

添加完成之后需要使用以下命令來加載進程。

supervisorctl reload

由于 supervisor 管理的進程不能設置為 daemon 模式,故如果 Redis 無法正常啟動,可以查看一下 Redis 的配置,并將daemonize選項設置為 no。

daemonize no

到文件的地步添加如下信息

[program:celery]# 啟動命令入口command=/var/www/newweb/venv/bin/celery worker -A celery_worker.celery --loglevel=info# 命令程序所在目錄directory=/var/www/newweb/# 運行命令的用戶名user=rootautostart=trueautorestart=true# 日志地址stdout_logfile=/var/log/newymw2.0/supervisor/newymw2.0_celery.log

另外在celery.worker下設置beat定時任務的進程

[program:celery.beat] 
;指定運行目錄 
directory=/home/xxx/webapps/yshblog_app/yshblog
;運行目錄下執行命令
command=celery -A yshblog worker --loglevel info --logfile celery_beat.log;啟動設置 
numprocs=1          ;進程數
autostart=true      ;當supervisor啟動時,程序將會自動啟動 
autorestart=true    ;自動重啟;停止信號
stopsignal=INT

worker和beat都設置好之后就可以配置redis了。

[program:redis]
;指定運行目錄 
directory=~/webapps/yshblog_app/lib/redis-3.2.8/
;執行命令(redis-server redis配置文件路徑)
command=redis-server redis.conf;啟動設置 
numprocs=1          ;進程數
autostart=true      ;當supervisor啟動時,程序將會自動啟動 
autorestart=true    ;自動重啟;停止信號
stopsignal=INT

啟動supervisord

supervisord -c /home/supervisor/supervisor.conf

查看進程狀態

supervisorctl -c /home/supervisor/supervisor.conf status all

加載supervisord,在新添加進程的情況下使用加載,新添加一個,加載一次。

supervisorctl -c /home/supervisor/supervisor.conf reload

運行測試celery過程中如果出現如下錯誤(celery不能用root用戶來啟動),按照以下步驟添加,即可解決

測試命令:

 celery -A celery_sq worker -l info

錯誤信息:

Running a worker with superuser privileges when the
worker accepts messages serialized with pickle is a very bad idea!If you really want to continue then you have to set the C_FORCE_ROOT
environment variable (but please think about this before you do).User information: uid=0 euid=0 gid=0 egid=0

解決辦法:

celery.py添加如下代碼from celery import Celery, platformsplatforms.C_FORCE_ROOT = True

測試成功頁面

?測試成功之后開始測試beat

測試beat命令:

celery -A celery_sq beat -l info

測試成功頁面:

成功之后守護進程就是這個樣子的。

?

[program:redis]
command=/home/redis-4.0.1/src/redis-server
autostart=true
autorestart=true
startsecs=3
stdout_Logfile=/home/celery_log/redis.log
stderr_logfile=/home/celery_log/redis_error.log
redis.ini
[program:celeryworker]
directory=/root/.pyenv/versions/Celery_prj/celery_sq
command=celery -A celery_sq worker -l info 
autostart=true
autorestart=true
stdout_logfile=/home/celery_log/celery_worker.log
stderr_logfile=/home/celery_log/celery_worker_error.log
worker.ini
[program:celerybeat]
directory=/root/.pyenv/versions/Celery_prj/celery_sq
command=celery -A celery_sq beat -l info
autostart=true
autorestart=true
stdout_logfile=/home/celery_log/celery_beat.log
stderr_logfile=/home/celery_log/celery_beat_error.log
beat.ini

到此為止,windows以及Linux下django-celery守護進程以及配置全部完成,? ? 以上由本人全部親測,一步一步寫進博客,如有問題,請及時提出。見到第一時間修改。/抱拳

?

轉載于:https://www.cnblogs.com/wuyongcong/p/9773345.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388235.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388235.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388235.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網頁視頻15分鐘自動暫停_在15分鐘內學習網頁爬取

網頁視頻15分鐘自動暫停什么是網頁抓取? (What is Web Scraping?) Web scraping, also known as web data extraction, is the process of retrieving or “scraping” data from a website. This information is collected and then exported into a format that …

Unity3D面試ABC

Unity3D面試ABC 楊航最近在學Unity3D 最先執行的方法是: 1、(激活時的初始化代碼)Awake,2、Start、3、Update【FixUpdate、LateUpdate】、4、(渲染模塊)OnGUI、5、再向后&#xff…

前嗅ForeSpider教程:創建模板

今天,小編為大家帶來的教程是:如何在前嗅ForeSpider中創建模板。主要內容有:模板的概念,模板的配置方式,模板的高級選項,具體內容如下: 一,模板的概念 模板列表的層級相當于網頁跳轉…

2.PHP利用PDO連接方式連接mysql數據庫

代碼如下 <?php$serverName "這里填IP地址";$dbName "這里填數據庫名";$userName "這里填用戶名&#xff08;默認為root&#xff09;";$password "";/*密碼默認不用填*/try { $conn new PDO("mysql:host$serverName;…

django 性能優化_優化Django管理員

django 性能優化Managing data from the Django administration interface should be fast and easy, especially when we have a lot of data to manage.從Django管理界面管理數據應該快速簡便&#xff0c;尤其是當我們要管理大量數據時。 To improve that process and to ma…

3D場景中選取場景中的物體。

楊航最近在學Unity3D&#xfeff;&#xfeff;&#xfeff;&#xfeff;在一些經典的游戲中&#xff0c;需要玩家在一個3D場景中選取場景中的物體。例如《仙劍奇俠傳》&#xff0c;選擇要攻擊的敵人時、為我方角色增加血量、為我方角色添加狀態&#xff0c;通常我們使用鼠標來選…

xpath之string(.)方法

from lxml import etreehtml <li class"tag_1">需要的內容1<a>需要的內容2</a></li> selector etree.HTML(html ) contents selector.xpath ( //li[class "tag_1"]) contents1 selector.xpath ( //li[class "tag…

循環語句

循環語句&#xff1a; 當我們要做一些重復的操作時&#xff0c;首先想到的是有沒有一種循環的語句&#xff1f; 答案當然有 Java提供了三種循環&#xff1a; for循環&#xff0c;在Java5中引入了一種主要用于數組的增強型for循環。while循環do……while循環for循環語法1&#x…

canva怎么使用_使用Canva進行數據可視化項目的4個主要好處

canva怎么使用(Notes: All opinions are my own. I am not affiliated with Canva in any way)(注意&#xff1a;所有觀點均為我自己。我與Canva毫無關系) Canva is a very popular design platform that I thought I would never use to create the deliverable for a Data V…

如何利用Shader來渲染游戲中的3D角色

楊航最近在學Unity3D&#xfeff;&#xfeff; 本文主要介紹一下如何利用Shader來渲染游戲中的3D角色&#xff0c;以及如何利用Unity提供的Surface Shader來書寫自定義Shader。 一、從Shader開始 1、通過Assets->Create->Shader來創建一個默認的Shader&#xff0c;并取名…

深入bind

今天來聊聊bind 關于之前的call跟apply 查看此鏈接 我們要明確4點內容 1. bind之后返回一個函數 let obj {name : skr } function fn(){console.log(this) } let bindfn fn.bind(obj) console.log(typeof bindfn) // function 2.bind改變this 并且可以傳參 bind之后的函數仍…

Css單位

尺寸 顏色 轉載于:https://www.cnblogs.com/jsunny/p/9866679.html

ai驅動數據安全治理_JupyterLab中的AI驅動的代碼完成

ai驅動數據安全治理As a data scientist, you almost surely use a form of Jupyter Notebooks. Hopefully, you have moved over to the goodness of JupyterLab with its integrated sidebar, tabs, and more. When it first launched in 2018, JupyterLab was great but fel…

【Android】Retrofit 2.0 的使用

一、概述 Retrofit是Square公司開發的一個類型安全的Java和Android 的REST客戶端庫。來自官網的介紹&#xff1a; A type-safe HTTP client for Android and JavaRest API是一種軟件設計風格&#xff0c;服務器作為資源存放地。客戶端去請求GET,PUT, POST,DELETE資源。并且是無…

一個透明的shader

楊航最近在學Unity3D&#xfeff;&#xfeff;Shader "Custom/xiankuang" { Properties { _LineColor ("Line Color", Color) (1,1,1,1) _GridColor ("Grid Color", Color) (1,1,1,0) _LineWidth ("Line Width", float) 0…

Mysql常用命令(二)

對數據庫的操作 增 create database db1 charset utf8; 查 # 查看當前創建的數據庫 show create database db1; # 查看所有的數據庫 show databases; 改 alter database db1 charset gbk; 刪 drop database db1; 對表的操作 use db1; #切換文件夾select database(); #查看當前所…

python中定義數據結構_Python中的數據結構—簡介

python中定義數據結構You have multiples algorithms, the steps of which require fetching the smallest value in a collection at any given point of time. Values are assigned to variables but are constantly modified, making it impossible for you to remember all…

1206封裝電容在物料可靠性設計比較低

1206封裝電容在物料可靠性設計中是要盡力避免的&#xff0c;盡量選擇0805或1210。在現場中容易出現電容因斷裂而擊穿的情況。同時容易造成保險絲燒斷。轉載于:https://www.cnblogs.com/conglinlixian/p/10414877.html

Java開發中 Double 和 float 不能直接運算

不能直接運算 是因為計算機儲存浮點類型的數值使用指數和尾數來表示 這就意味著計算時會出現“精度缺失”的現象 為了解決這個問題 我們引入 java.math.BigDecimal類來進行精確計算。 具體如下&#xff1a; public class Arith { //加法運算 public static double add(dou…

Unity3D 場景與C# Control進行結合

楊航最近在自學Unity3D&#xff0c;打算使用這個時髦、流行、強大的游戲引擎開發一個三維業務展示系統&#xff0c;不過發現游戲的UI和業務系統的UI還是有一定的差別&#xff0c;很多的用戶還是比較習慣WinForm或者WPF中的UI形式&#xff0c;于是在網上搜了一下WinForm和Unity3…