日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

django-celery定时任务以及异步任务and服务器部署并且运行全部过程

發(fā)布時間:2023/11/30 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 django-celery定时任务以及异步任务and服务器部署并且运行全部过程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Celery

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

應(yīng)用之前,要確保環(huán)境中添加了Celery包。

pip install celery pip install dajngo-celery

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

RabbitMQ用戶手冊:

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

Redis中文官網(wǎng):

http://www.redis.cn/

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

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

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

打開鏈接之后,出現(xiàn)如下頁面,然后點擊? ? ?releases

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

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

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

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

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

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

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

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文件版本過高或者過低所導(dǎo)致問題出現(xiàn),

啟動成功界面:

redis啟動成功之后就不要關(guān)閉,應(yīng)為celery是基于redis來收發(fā)任務(wù)的, 需要用到redis的隊列。

環(huán)境到此安裝完成之后,開始寫個簡單的異步任務(wù)。

Celery 異步任務(wù)

新創(chuàng)建一個Django項目,添加一個應(yīng)用。

django-admin startproject celery_sq

新建應(yīng)用

python manage.py startapp app

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

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

from celery.schedules import crontab from celery.schedules import timedelta 導(dǎo)入

在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' 底部添加代碼

以上代碼添加完成之后再同級目錄下創(chuàng)建 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文件, 注意:一個應(yīng)用下只能添加一個tasks.py 一個py一遍可寫多個任務(wù)。

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文件里邊添加函數(shù)。

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

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

python manage.pu runserver

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

python manage.py celery worker --loglevel=info

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

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

Celery定時任務(wù)

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

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 = { # 定時器策略# 定時任務(wù)一: 每隔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。

參數(shù)定義:

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

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

celery -A celery_sq beat -l info

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

任務(wù)成功執(zhí)行之后狀態(tài)

  

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

Linux下部署django-celery

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

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

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

supervisor官網(wǎng):

http://supervisord.org

安裝Redis:

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

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

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分發(fā)ini文件目錄。

配置完成之后創(chuàng)建conf.d目錄

mkdir conf.d

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

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

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

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

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

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

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

[program:hello] 名字隨意,不要重復(fù) 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 指定停止參數(shù): start status stop restart 啟動,狀態(tài), 停止, 重啟

以上圖片是啟動成功之后的狀態(tài)。

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

添加redis.ini文件,將以下內(nèi)容添加。

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

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

supervisorctl reload

由于 supervisor 管理的進程不能設(shè)置為 daemon 模式,故如果 Redis 無法正常啟動,可以查看一下 Redis 的配置,并將daemonize選項設(shè)置為 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下設(shè)置beat定時任務(wù)的進程

[program:celery.beat] ;指定運行目錄 directory=/home/xxx/webapps/yshblog_app/yshblog ;運行目錄下執(zhí)行命令 command=celery -A yshblog worker --loglevel info --logfile celery_beat.log;啟動設(shè)置 numprocs=1 ;進程數(shù) autostart=true ;當(dāng)supervisor啟動時,程序?qū)詣訂? autorestart=true ;自動重啟;停止信號 stopsignal=INT

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

[program:redis] ;指定運行目錄 directory=~/webapps/yshblog_app/lib/redis-3.2.8/ ;執(zhí)行命令(redis-server redis配置文件路徑) command=redis-server redis.conf;啟動設(shè)置 numprocs=1 ;進程數(shù) autostart=true ;當(dāng)supervisor啟動時,程序?qū)詣訂? autorestart=true ;自動重啟;停止信號 stopsignal=INT

啟動supervisord

supervisord -c /home/supervisor/supervisor.conf

查看進程狀態(tài)

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

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

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

運行測試celery過程中如果出現(xiàn)如下錯誤(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守護進程以及配置全部完成,? ? 以上由本人全部親測,一步一步寫進博客,如有問題,請及時提出。見到第一時間修改。/抱拳

?

轉(zhuǎn)載于:https://www.cnblogs.com/wuyongcong/p/9773345.html

總結(jié)

以上是生活随笔為你收集整理的django-celery定时任务以及异步任务and服务器部署并且运行全部过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。