day_22_git&celery

一、git协作开发

1.版本管理工具介绍(需求分析)

 hanqian  通讯录       接口格式的商议,统一接口,下面要使用
 weibiao  朋友圈
 yuangen  视频通话

第一次合并很容易
git作用:
版本控制(回滚)
协作开发

git安装
windows安装(略)
ubuntu16.4 apt install git

2.git 基本使用
a.创建新项目

 mkdir s16day21     创建项目目录
 git init           初始化git项目
 git status         查看当前目录状态
 git add f1 f2      把代码提交到 stage 区域
 git add .
 git commit         从stage区域 提交代码到仓库
 git commit -m "first time"

b.查看操作日志

 git log                    查看commit 日志
 git log --pretty=oneline   简化打印日志
 git reflog                 查看详细的操作日志,包括提交 , 回滚操作

3.回滚操作

 git reset --hard HEAD^     回滚到上一个版本
 git reset --hard 34234     回滚到指定版本

4.git stage区介绍

只提交指定文件

git reset HEAD f1    把代码从stage区域回到working directory
git checkout -- f1   在working directory把已修改,但未提交的代码,回到未修改前

5.git 基本使用

git删除相应的文件
git rm f1 ; git commit -m "xxx"

添加本地项目之远程
git remote add origin https:github.com/lijie2721/s16day21.git 只需要写一次
git push -u origin master

6.通过github托管你的项目
ssh-keygen无密码传输
vim .git/setting

7.分支策略
下载gilib中的代码库
git clone https:github.com/lijie2721/s16day21.git

模拟简单两人进行代码上传操作

下载gilib中的代码库
git clone https:github.com/lijie2721/s16day21.git
windows上
vim main.py
vim conf/settings.py
git add .
git commit -m "update from windows"
git push origin master
linux上
vim main.py
vim conf/settings.py
git add .
git commit -m "update from linux"
这是远程仓库代码已经更新,不能push
自动合并并且解决冲突
git pull origin master
vim main.py
vim conf/settings.py
提交代码
git add .
git commit -m "fix confict"
提交代码
git push origin master

分支管理,就相当于平行宇宙

分支合并套路

1.切回本地master
2.git pull origin master    拉取远程最新的master代码
3.git merge dev_branch      在master分支上合并dev分支
4.把合并的代码push到远程master上

分支策略使用的具体实例
就是本地dev1与远程master进行合并,此时master已经更新

windows上
先更新
git pull origin master
git branch dev1
git branch
git checkout dev1
vim main.py
git add .
git commit -m "short viedeo"
git push origin dev1

linux在master上直接修改
vim main.py
git add .
git commit -m "add red bag"
git push origin master

此时windows上dev1修改
vim conf/settings.py
切换回master上
git checkout master
git branch
git push origin master
git merge dev1      在master分支上合并dev1分支
vim main.py     合并冲突
git add .
git commit -m "fix merge"
git push origin master

8.bug分支
分支命名
master
dev
feature-100 敏捷开发(小版本迭代)
hotfix-50/bug-50

开发dev1
git pull origin dev1
git branch
git checkout dev1
vim main.py
git stash             保存工作区到临时地方
git status
git branch hotfix-100
vim main.py
git add .
git commit -m "fix bug100"

切回master修复hotfix-100
git checkout master
git pull origin master
git merge hotfix-100
git status
git push origin master

切回dev1
git checkout dev1
git stash list
git stash apply stash@{0}
git status

git stash 保存工作区到临时地方
git stash apply 恢复stash区的内容
git stash drop 删除stash区的内容
git stash pop 恢复并删除

9.git ignore

http://www.cnblogs.com/alex3714/articles/5930846.html

https://github.com/github/gitignore
vim .gitignore

使用beyond compare对冲突进行合并

二、分布式任务队列celery

1. Celery介绍

任务管理介绍

Celery有以下优点:
1. 简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的
2. 高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务
3. 快速:一个单进程的celery每分钟可处理上百万个任务
4. 灵活: 几乎celery的各个组件都可以被扩展及自定制

Celery工作模式

Celery基本工作流程图

2. Celery基本异步任务
使用redis作为broker
apt install redis-server
lsof -i:6379
pip3 install celery

vim tasks.py #编辑任务列表

from celery import Celery
import time

app = Celery("TASK",
             broker = "redis://localhost",
             backend = "redis://localhost")

@app.task
def sayhi(name):
    print("hello",name,dd)
    return "hello %s"%name

@app.task
def add(x,y):
    time.sleep(5)
    print("running....",x,y)
    return x + y

开启celery程序
celery -A tasks worker -l debug

打开Python解释器,进行任务的发送

import tasks
t = tasks.add.delay(57,8)
t.ready()
t.get()

t = tasks.add.delay(57,8)
t.get(timeout=0.1)          # 如果在超时时间内未完成,会报错

t = tasks.sayhi.delay("alex")
t.get(propagate=False)      # 程序错误时,拿取错误信息
t.traceback

在项目中使用Celery和分布式
mkdir my_proj
cd my_proj/

vim celery.py

from __future__ import absolute_import, unicode_literals
from celery import Celery

app = Celery('proj',
             broker='redis://localhost',
             backend='redis://localhost',
             include=['my_proj.tasks','my_proj.tasks2'])

# Optional configuration, see the application user guide.
app.conf.update(
    result_expires=3600,
)

if __name__ == '__main__':
    app.start()

vim tasks.py

from __future__ import absolute_import, unicode_literals
from .celery import app

@app.task
def add(x, y):
    return x + y

@app.task
def mul(x, y):
    return x * y

@app.task
def xsum(numbers):
    return sum(numbers)

vim tasks2.py

from __future__ import absolute_import, unicode_literals
from .celery import app

@app.task
def run(name):
    print("run func.....")
    return "running_running"

进到my_proj同一目录中
celery -A my_proj worker -l info (开启两个进程)
打开Python解释器,进行任务的发送
进到my_proj同一目录中

from my_proj import tasks
from my_proj import tasks2
tasks2.run.delay("alex")
tasks.add.delay(3,4)

后台启动worker

celery multi start w1 -A my_proj -l info
celery  multi restart w1 -A my_proj -l info
celery multi stop w1 -A my_proj -l info
celery multi stop w1 w2 w3
celery multi stopwait w1 -A my_proj -l info     #确保当前正在执行的任务完成,再结束该进程

3. Celery定时任务

# vim my_proj/periodic_tasks.py # 直接编写文件

from __future__ import absolute_import, unicode_literals
from .celery import app
from celery.schedules import crontab

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # Calls test('hello') every 10 seconds.
    sender.add_periodic_task(10.0, test.s('hello'), name='add every 10')

    # Calls test('world') every 30 seconds
    sender.add_periodic_task(30.0, test.s('world'), expires=10)

    # Executes every Monday morning at 7:30 a.m.
    sender.add_periodic_task(
        crontab(hour=7, minute=30, day_of_week=1),
        test.s('Happy Mondays!'),
    )

@app.task
def test(arg):
    print("periodic tasks:",arg)

# vim my_proj/celery.py # 通过配置文件修改

from __future__ import absolute_import, unicode_literals
from celery import Celery

app = Celery('proj',
             broker='redis://localhost',
             backend='redis://localhost',
             include=['my_proj.tasks',
                      'my_proj.periodic_tasks',
                      'my_proj.tasks2'])

# Optional configuration, see the application user guide.
app.conf.beat_schedule = {
    'add-every-5-seconds': {
        'task': 'my_proj.tasks.add',
        'schedule': 30.0,
        'args': (16, 16)
    },
}
app.conf.timezone = 'UTC'

app.conf.update(
    result_expires=3600,
)

if __name__ == '__main__':
    app.start()
View Code

# 启动计划任务

celery -A my_proj.periodic_tasks beat -l debug

# 启动worker

celery -A my_proj worker -l debug

4. Celery与Django最佳实践 django与celery结合实现异步任务

vim urls.py

url(r'^celery_call/', views.celery_call),
url(r'^celery_result/', views.celery_result),

vim /root/CrazyEye/CrazyEye/celery.py

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'CrazyEye.settings')

app = Celery('CrazyEye_test')

# 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', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))
View Code

vim settings.py # 在配置文件中配置中间件redis

# for celery
CELERY_BROKER_URL = "redis://localhost"
CELERY_RESULT_BACKEND = "redis://localhost"

vim /root/CrazyEye/CrazyEye/__init__.py # 在Django启动时,指定使用celery

from __future__ import absolute_import, unicode_literals

# 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']

vim /root/CrazyEye/web/tasks.py # 在具体app中的tasks.py编写任务

# Create your tasks here
from __future__ import absolute_import, unicode_literals
from celery import shared_task
import time

@shared_task
def add(x, y):
    time.sleep(20)
    print("run add ....")
    return x + y

@shared_task
def mul(x, y):
    return x * y

@shared_task
def xsum(numbers):
    return sum(numbers)

vim /root/CrazyEye/web/views.py # 在django views里调用celery task

from django.shortcuts import render,HttpResponse

# Create your views here.
from web import tasks
from celery.result import AsyncResult
import random

def celery_call(request):
    t = tasks.add.delay(4,random.randint(0,100))
    res = t.id
    # print(t.get())
    return HttpResponse(res)

def celery_result(request):
    task_id = request.GET.get("id")
    res = AsyncResult(id = task_id)
    if res.ready():
        result = res.get()
    else:
        result = res.ready()
    return HttpResponse(result)
View Code

启动Django
python3 runserver 0.0.0.0:9000
项目启动
celery -A CrazyEye worker -l debug
Django运行访问项目出现的问题:DisallowedHost at / Invalid HTTP_HOST header
http://blog.csdn.net/will5451/article/details/53861092

5. Celery与Django实现定时任务

a. pip3 install django_celery_beat
b. vim settings.py

INSTALLED_APPS = [
    ......
    'django_celery_beat',
]

c. 使用django数据库管理计划任务
python3 manage.py makemigrations # 这一步不需要执行
python3 manage.py migrate
d. 创建用户
python3 manage.py createsuperuser
root
root!23456
e. 启动Django
python3 runserver 0.0.0.0:9000

在admin页面里,有3张表

配置完长这样

f. 启动worker
celery -A CrazyEye worker -l info

g. 启动celery beat service
celery -A CrazyEye beat -l info -S django


此时启动你的celery beat 和worker,会发现每隔2分钟,beat会发起一个任务消息让worker执行scp_task任务

注意,经测试,每添加或修改一个任务,celery beat都需要重启一次,要不然新的配置不会被celery beat进程读到

 

posted @ 2017-06-29 09:54  huaxiayidao  阅读(46)  评论(0)    收藏  举报