编程技术

Django+Celery+Rabbitmq+Flower使用小记

Roy

之前的博客中简单的介绍了celery的安装配置以及如何在python程序中使用,这里记录一下我使用django结合celery以及rabbitmq提供web服务,同时使用flower进行监控的过程。至于这几样东西是什么、怎么安装这里就不再细说了。

python基础复习之使用字典分派函数

Roy

程序中很常见的一种场景就是根据某个控制变量的值来调用不同的函数或对象进行处理,某些语言中可以使用case语句进行处理,在python可以使用getattr函数甚至if…elif…else来处理,除此之外,也可以使用字典来实现相同的功能,比如下面的例子:

animals = []
number_of_felines = 0
def deal_cat():
    global number_of_felines
    print "meow"
    animals.append('feline')
    number_of_felines += 1
def deal_dog():
    print 'bark'
    animals.append('canine')
def deal_bear():
    print "hug"
    animals.append('ursine')
token = {'cat': deal_cat, 'dog': deal_dog, 'bear': deal_bear}
#words = ['cat', 'dog', 'bear']

words = ['cat', 'dog', 'bear', 'cat']
for one in words:
    token[one]()
    #return token[one]()

nf = number_of_felines
print 'we met %d feline%s' % (nf, 's'[nf == 1:])
print 'the animals we net were:', ' '.join(animals)

celery使用小记

Roy

之前的博客有关于celery以及相关概念的介绍,不过那篇文章没有具体的使用示例,今天补充一下。

目前celery的版本是3.1.19

这里我使用rabbitmq作为broker以及banckend。

关于functools.wraps的作用

Roy
今天看代码时候有这么一段: from functools import wraps def http_basic_auth(func): '''定义httpbasicauth装饰器''' @wraps(func) def _decorator(request, *args, **kwargs): authorization = request.

flask-socketio中文文档

Roy

官网在这里,英语好的直接去看官网文档吧,我是英语渣只能翻译个大概;另外注意本文翻译时间,可能你看到的时候官网已经更新了。


flask-socketio赋予了flask程序支持服务端和客户端间双向低延迟通讯的能力,客户端可以使用 SocketIO 库或任何支持与服务端建立长链接的兼容库。

安装

可以直接使用pip安装:

pip install flask-socketio

依赖

自从1.0版开始,这个扩展完全兼容了python2.7和python3.3+版本。异步服务的支持基于下面3个选择中的一个:

  • eventlet 是3个选项中性能最高的,同时支持长轮循(long-polling)和WebSocket。
  • gevent 是在以前版本中使用的框架,支持长轮循,如果想支持WebSocket的话需要同时安装gevent-websocket 库。使用gevent和gevent-websocket结合性能也不错,但略低于eventlet。
  • flask 基于Werkzeug的开发服务也能用,不过性能上不如上面2个选项,所以它应该只用于开发时使用。这个选项只支持长轮循。 本扩展将自动检测哪些异步框架被安装,默认首选eventlet,其次是gevent,最后是flask自带的开发服务。 对于客户端来说,可以使用官方的Socket.Io来建立于服务端的链接,也有使用swift和c++写成的客户端。非官方的客户端也能工作,只要它实现了Socket.IO 协议。

目前的局限

目前flask-socketio只能同时运行在单个进程中(这里应该指的是一个进程中仅能存在一个实例的意思,而非只能开启一个进程吧…),解决这个限制的工作正在进行中。 (关于升级变化、以及从老版本迁移到新版的注意事项我就不翻译了,因为没用过老版本)

python脚本模拟tail命令

Roy
今天有个需求,需要实时监控nginx日志中某些ip的访问情况。如果ip较少的话,直接使用tail、grep以及管道配合即可。不过需要监控100个左右的ip并进行相应处理的话,除了自己写脚本还真没想到别的办法。 首先引出Python中自带的2个函数: file.seek(off, whence=0) 从文件中移动off个操作标记(文件指针),正往结束方向移动,负往开始方向移动。如果设定了whence参数,就以whence设定的起始位为准,0代表从头开始,1代表当前位置,2代表文件最末尾位置。 file.tell() 返回文件指针的当前位置。 那么思路就比较清晰了,写一个死循环,循环内记录指针位置并赋值给seek函数: