ジャンゴ+ chereyの展開
1、オールドボーイズ参照:
http://www.cnblogs.com/alex3714/p/6351797.html
2、準備ができて
1、数据库部署
redis部署:
https://blog.csdn.net/feifeiyechuan/article/details/104463237
2、安装必要的包
pip install celery
pip install django-celery-results # 使用django存储数据
pip install redis
pip install django_celery_beat # 安装调度器,调度器可以使用admin进行定时
3、安装数据库
python manage.py makemigrations # 这个可以不用,但是最好运行一下
python manage.py migrate
4、创建超级用户
python manage.py createsuperuser
5、登录admin会发现多了表格,具体介绍在上述老男孩链接最后一部分有展示
3、カタログケース
4、設定セット
# djcelery.setup_loader()
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'visit_task',
'django_celery_results',
'django_celery_beat',
]
# celery
BROKER_URL = 'redis://:密码@ip地址:端口/0' # redis://:password@hostname:port/db_number
CELERY_RESULT_BACKEND = 'django-db' # 接收返回结果,保存至django数据库,但是install-app添加django_celery_results
CELERY_ACCEPT_CONTENT = ['application/json', ]
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = TIME_ZONE
CELERYD_PREFETCH_MULTIPLIER = 1 # worker每次取的任务数量
CELERYD_FORCE_EXECV = True # 非常重要,有些情况下可以防止死锁
# # 每个celery worker再运行完后就死掉
CELERYD_MAX_TASKS_PER_CHILD = 40
# CELERY_ALWAYS_EAGER = True # 如果开启,Celery便以eager模式运行, 则task便不需要加delay运行,别开啊,千万
5、セロリの設定
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery, platforms
from kombu import Exchange,Queue
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'follow_up_visit.settings')
app = Celery('follow_up_visit')
# 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'
)
CELERY_TIMEZONE='Asia/Shanghai' #并没有北京时区,与下面TIME_ZONE应该一致
# BROKER_URL='amqp://guest:guest@localhost:15672//' #任何可用的redis都可以,不一定要在django server运行的主机上
# CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
# CELERY_RESULT_BACKEND = 'django-db'
# rabbitmq做MQ配置
# app = Celery('follow_up_visit', backend='amqp', broker='amqp://admin:admin@localhost')
# Load task modules from all registered Django app configs.
from django.conf import settings # noqa
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
# 允许root 用户运行celery
platforms.C_FORCE_ROOT = True
CELERYD_FORCE_EXECV = True # 非常重要,有些情况下可以防止死锁
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
# 定时任务
from celery.schedules import crontab, timedelta
app.conf.update(
CELERYBEAT_SCHEDULE={
# 'update_task': {
# 'task': 'visit_task.tasks.update_task',
# 'schedule': timedelta(seconds=10),
# 'args': ()
# },
# 'schedule_task': {
# 'task': 'visit_task.tasks.start_happyNewYear',
# 'schedule': crontab(month_of_year=1, day_of_month=24, hour=12, minute=5),
# 'args': ()
# }
}
)
6、__init__.py設定の設定の同じレベルを持ちます
from __future__ import absolute_import, unicode_literals
import pymysql
# load mysql
pymysql.install_as_MySQLdb()
# load celery
# 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
__all__ = ['celery_app']
7、task.py
from celery import shared_task, task
8、コール
9、startコマンド
conda activate py368
export PYTHONIOENCODING=utf-8
nohup python manage.py runserver 0.0.0.0:7068 & # 启动django服务
celery -A follow_up_visit worker -l info # 启动一个worker
# 关闭celery
ps auxww | grep 'celery' | awk '{print $2}' | xargs kill -9
# redis操作:
# 清空redis
redis-cli -a 123456
flushall
exit
# 其他
(1)
celery multi start w1 -A 项目名 --loglevel=INFO # w1,w2为指定worker的名称,一次也是启动给一个,但是不会有实时日志显示在shell中,可以实现分布式。生产商使用
(2)
启动beat调度器才能执行这个任务计划。django只是保存调度任务
celery -A 项目名 beat -l info -S django # -S 表示从哪儿读取调度任务(新增需要重启)
然后启动worker就可以了
eg:
celery multi restart w1 -A 项目名 -l info # 重启worker w1
celery multi stop w2 # 停止worker w2
如果一直不发调度任务,需要清空数据库,积压了很多任务先去执行
(3)关于返回结果
创建调用
from task import add
res = add.delay() # 执行异步任务
res.get(timeout=1) # 可以获取到return的执行结果,如果不写timeout会一直监测直到返回结果
res.get(propagate=False) # 不会报使程序报错的异常
res.ready() # 获取执行状态,是否准备好,是否完成
res.task_id # 获取id
from celery.result import AsyncResult
res = AsyncResult (task_id) # 通过task_id 获取结果
res,status # 任务状态 PENDING + SUCCESS
res.get() # 获取结果
res.trace_task # 追踪错误信息
#RabbitMQの他)がストアにデータベースを使用する:(ない、あまりにも乱雑です
1、ジャンゴ+セロリは非同期で実行しました
手順:https://ops-coffee.cn/s/lXrp3igYo9W2UuE5Gauysg
インストールの内容:
インストールリファレンス:https://blog.csdn.net/m0_37034294/article/details/82839494(勝利)
(1)アーランインストール
https://www.erlang.org/downloads
(2)のRabbitMQサーバーインストール
https://www.rabbitmq.com/download.html
2、サーバーの展開プロセス
(1)、容器を開けます。
ジャンゴ:
sudoのドッキングウィンドウの実行-it -p 7080:8000 --name = 'suifang_v1.0' --network sf_network --network-エイリアスSF-ネットワークubuntu_tfgpu_py36:v1.0を/ binに/ bashの
MySQLの:
ドッキングウィンドウの実行-d -e MYSQL_ROOT_PASSWORD = 123456 -p 7083:3306 --network sf_network --network-エイリアスSF-ネットワーク--name mysql_suifang_v1.0のmysql
容器に、スイッチング環境:
condaアクティブpy368
https://www.jianshu.com/p/6dd13d39d613
(2)、コードを引っ張っ
(3)、セロリマウント
、取り付けのRabbitMQサーバのデータベースサービス(abbitmq DOキュー)(参考:RabbitMQのインストールと初期設定https://www.cnblogs.com/chrischennx/p/7071471.html)
RabbitMQのサーバーをインストールapt-getを
サービスを開始します。
オープンサービスへのRabbitMQサーバーの開始(長いほど)
RabbitMQのサーバ停止ストップサービス
rabbitmqctlステータス表示の状態
nohupをRabbitMQのサーバ起動&
B、インストールcherey
ピップセロリをインストール
(4)のDjangoのバージョンを確認します
ピップインストールジャンゴ== 2.0.6 -i https://pypi.douban.com/simple
(5)、インストールパッケージ
ピップインストールPyMySQL -i https://pypi.douban.com/simple
ピップインストールのWebSocket -i https://pypi.douban.com/simple
-iクライアントインストールのWebSocket PIP https://pypi.douban.com/simple(修正されたソースコード)
パス:/root/miniconda3/envs/py368/lib/python3.6/site-packages/websocket/84行パラメータ:, cur_message =なし、SEND_MESSAGE = Noneを追加せず、プロセスに追加__init__:self.cur_message = cur_message self.send_message = SEND_MESSAGE
ピップリクエストをインストール-i https://pypi.douban.com/simple
(6)、Cherery開始
スタートワーカー待ちタスク
PIP eventlet取付eventlet(エラー防止)をインストール
セロリ-A follow_up_visitワーカー-l情報-Pのeventlet(窓は-P eventletエラーを防ぎます)
nohupをセロリ-A follow_up_visit労働者-lインフォメーション&
スタートビートタスクのスケジューリング
セロリの-A follow_up_visitは-l情報を倒します
nohupをセロリ-A follow_up_visitビート-lインフォメーション&
すべてのスタート
セロリ-Aプロジェクト名の労働者-b -l情報
(7)のDjangoプロジェクトを開始します
nohupをPythonのmanage.pyのrunserver 0.0.0.0:8000&
(8)動作の概要:
CDを/ tmp / follow_up_visit
condaアクティブpy368
nohupをRabbitMQのサーバ起動&
nohupをPythonのmanage.pyのrunserver 0.0.0.0:8000&
nohupをセロリ-A follow_up_visitビート-lインフォメーション&
nohupをセロリ-A follow_up_visit労働者-lインフォメーション&
#关闭セロリ
PS auxww | grepの'セロリ' | awkは'{$ 2印刷}' | xargsが殺す-9