Celery学习使用及想法

Celery学习


1.Messages are sent to exchanges.
2.An exchange routes messages to one or more queues. Several exchange types exists, providing different ways to do routing, or implementing different messaging scenarios.
3.The message waits in the queue until someone consumes it.
4.The message is deleted from the queue when it has been acknowledged.


Celery使用

svn安装配置高级版本(使用httpd)

环境


系统: centos6.5

svn版本: svn1.6

安装svn


安装svn,一般选择yum方式安装比较简单(注:如果你还不知道什么是yum那么你和六个月前的我是一样的,赶紧拿起鸟哥[不是鸟叔]狂撸一个月吧,保证你会爱上linux)

[root@liyong ~]# yum -y install mod_dav_svn

#会自动安装mod_dav_svn及其依赖包:mod_dav_svn-1.6.11-9,neon-0.29.3-2,pakchois-0.4-3.2,subversion-1.6.11-9

直接安装这个就能把svn服务器直接KO!怎么样是不是觉得自己已经大杀特杀了

下面我们来安装httpd

[root@liyong ~]# yum -y install httpd

注:一般情况下,Linux服务器都是有httpd服务的,你可以检查下,如果没有则安装
检查方法:

[root@liyong ~]# vi /etc/httpd/conf.d/subversion.conf

安装完svn后看是否有该目录&文件,如果存在则不需要安装httpd了。

安装完成,接下来就是配置[这才是重头戏]


配置svn仓库:

#创建svn目录
[root@liyong ~]# mkdir -p /home/svn/repos1 #仓库1
[root@liyong ~]# mkdir -p /home/svn/repos2 #仓库2

#可以任意配置,任意指定你喜欢的目录

#建立svn版本库
[root@liyong ~]# svnadmin create /home/svn/repos1
[root@liyong ~]# svnadmin create /home/svn/repos2

#有多少个仓库就执行多少次该命令,只需要换最后的名字即可
修改svn版本库配置文件:

[root@moshi ~]# vi /home/svn/repos1/conf/svnserve.conf

修改文件结果如下:

[general]
anon-access = none
auth-access = write
password-db = /home/svn/conf/pwd.conf #指向用户配置文件
authz-db = /home/svn/conf/authz.conf #指向权限配置文件
realm = repos1 #指向svn仓库地址

注:其它仓库配置和该配置相同,只需要修改仓库路径

配置svn用户和权限:

[root@moshi ~]# vim /home/svn/conf/pwd.cof
[root@liyong ~]# vim /home/svn/conf/authz.conf

#这是2个步骤,我这里为更好的阅读,写在一起
配置用户
由于这个配置是我自定义的,所以要先vim创建该文件,也可以用其他方式创建。
[root@liyong ~]# vim /home/svn/conf/pwd.conf

#保存退出
[root@liyong ~]# htpasswd -c /home/svn/conf/pwd.conf admin

#根据提示输入密码,第一个用户才需要加-c,后面的用户不需要-c
[root@liyong ~]# htpasswd /home/svn/conf/pwd.conf test
[root@liyong ~]# vi /home/svn/conf/pwd.conf
在用户最上方加上[users]
注:加上[users]这一步是很重要的,因为用htpasswd的方式会覆盖掉[users],所以每次加完用户都需要回去补一下这个节点哦,不然报错我这里可不负责哦

配置权限
[root@liyong ~]# vim /home/svn/conf/authz.conf
文件内容如下:
[groups]
admin=user1,user2
test=user3
[/]
@admin=rw
[repos1:/]
user3=r

注:[groups]为组定义,可以在该组下加很多用户,以,分割,
但是该用户数据必须在/homd/svn/conf/pwd.conf中定义好,[/]表示根目录以下的权限定义[repos1:/]表示仓库下的权限定义。如果要分项目,则以此规则类推:

如:[repos1:/aaa]则表示仓库下的aaa项目的权限定义。

@admin 表示admin这个组下的用户权限。

user1=r 表示user1这个用户的权限。

权限类型:r,w,rw 分别表示只读,只写,读写。如果是user1= 这种空情况则表示没有。
OK,到此svn配置完成。我们可以把默认的配置文件删除。

[root@liyong ~]# rm -rf /home/svn/repos1/conf/passwd
[root@liyong ~]# rm -rf /home/svn/repos2/conf/authz

##多个仓库则删除多个仓库对应的文件即可
建立启动svn的用户:

[root@liyong ~]# useradd svn                    ##如果提示svn账户已存在,则执行以下命令
[root@liyong ~]# passwd svn ##根据提示修改下密码,不能过于简单,可使用常用密码
[root@liyong ~]# chown -R svn:svn /home/svn/ ##允许用户svn访问版本库
[root@liyong ~]# chmod –R o+rw /home/svn ##解决windows检出提交提示/home/svn/db/txn-current-lock’错误

配置svn的端口:

[root@liyong ~]# vi /etc/httpd/conf/httpd.conf

找到

#Listen 12.34.56.78:80这一行,
Listen 9999 ##9999就是svn的端口,默认是80,你可以修改为自己想要的。不建议使用默认的80端口,原因大家肯定都知道对于web,80真的是太关键了

配置httpd:

[root@liyong ~]# vi /etc/httpd/conf.d/subversion.conf

修改内容为:

DAV svn
SVNListParentPath on
SVNParentPath /home/svn
AuthType Basic
AuthName “Authorization”
AuthUserFile /home/svn/conf/pwd.conf ##对应你的用户配置文件
AuthzSVNAccessFile /home/svn/conf/authz.conf ##对应你的权限配置文件
Require valid-user

保存退出!

重启httpd服务。

[root@liyong ~]# service httpd restart
停止 httpd: [确定]
正在启动 httpd: [确定]

出现以上字样,表名httpd的配置已经成功启动成功。

启动svn:

[root@liyong ~]# svnserve -d -r /home/svn/

查看svn服务是否正常:

[root@liyong ~]# ps aux|grep svn

#出现以下内容说明svn服务已经成功启动
root 8610 0.0 0.0 152864 740 ? Ss 11:25 0:00 svnserve -d -r /home/svn/repos1/
root 13128 0.0 0.0 103252 876 pts/0 S+ 14:00 0:00 grep svn

大功告成,现在你就可以在浏览器中输入:服务器Ip+端口+httpd配置中的[注:这里可能在上面的配置文件中可能没有显示出来,各位在这里留意下]

如:http://192.169.1.1:9999/svn

此时,会提示你输入用户名密码,填上你之前配置好的就可以登录了,是不是感觉自己已经超神了。victory!

python装饰器


理解 python中的装饰器,今天就说说这个问题!

标准装饰器写法

@makebold
def say():
return “Hello”
def makebold(fn):
def wrapped():
retuurn ““ + fn() + “
return wrapped

理解装饰器


我们先来看个小例子,好像所有说装饰器的人都说这个例子,不管了,哈哈哈!

def foo():
print ‘in foo()’
foo()

这是一个相当简单的函数,对的,甚至很无聊,但是我们就从这个来引出装饰器,提个需求,现在小白想要看看这个函数执行需要多长时间,于是可以这样做:

import time
def foo():
start = time.clock()
print ‘in foo()’
end = time.clock()
print ‘used: ‘, end - start

foo()

ok,现在小白的功能实现了,他很开心,但是这时他发现了foo2函数,并同样产生了兴趣,那怎么办,同样的代码在copy一下,NO!还记得吗,函数在python中是一等公民,那么我们可以考虑重新定义一个函数timeit,将foo的引用传递给他,然后在timeit中调用foo并进行计时,这样,我们就达到了不改动foo定义的目的,而且,不论小白看了多少个函数,我们都不用去修改函数定义了!

import time
def foo():
print ‘in foo()’
def timeit(func):
start = time.clock()
func()
end = time.clock()
print ‘used: ‘, end - start
timeit(foo)

看起来逻辑上并没有问题,一切都很美好并且运作正常!……等等,我们似乎修改了调用部分的代码。原本我们是这样调用的:foo(),修改以后变成了:timeit(foo)。这样的话,如果foo在N处都被调用了,你就不得不去修改这N处的代码。或者更极端的,考虑其中某处调用的代码无法修改这个情况,比如:这个函数是你交给别人使用的。

既然如此,我们就来想想办法不修改调用的代码;如果不修改调用代码,也就意味着调用foo()需要产生调用timeit(foo)的效果。我们可以想到将timeit赋值给foo,但是timeit似乎带有一个参数……想办法把参数统一吧!如果timeit(foo)不是直接产生调用效果,而是返回一个与foo参数列表一致的函数的话……就很好办了,将timeit(foo)的返回值赋值给foo,然后,调用foo()的代码完全不用修改!

#-- coding: UTF-8 --
import time
def foo():
print ‘in foo()’
def timeit(func):
def wrapper():
start = time.clock()
func()
end =time.clock()
print ‘used:’, end - start
return wrapper
foo = timeit(foo)
foo()

这样,一个简易的计时器就做好了!我们只需要在定义foo以后调用foo之前,加上foo = timeit(foo),就可以达到计时的目的,这也就是装饰器的概念,看起来像是foo被timeit装饰了。在在这个例子中,函数进入和退出时需要计时,这被称为一个横切面(Aspect),这种编程方式被称为面向切面的编程(Aspect-Oriented Programming)。与传统编程习惯的从上往下执行方式相比较而言,像是在函数执行的流程中横向地插入了一段逻辑。在特定的业务领域里,能减少大量重复代码。面向切面编程还有相当多的术语,这里就不多做介绍,感兴趣的话可以去找找相关的资料。

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment