Tag Archives: Python

Neutron 的软件架构

综述

OpenStack 是目前开源界第二大的项目,参与的厂商之多可谓少见,同时作为目前最大的以 Python 作为主要语言的项目,可以说这个项目是经过重重困难发展起来的,算是目前在发展的分布式系统软件大作了,面对这么一个项目,我想我们有很多值得学习和借鉴的地方,因为时间和个人经验的缘故,我在这里主要与大家分享以 Neutron 为例的 OpenStack 软件设计。

Why Python

设计一个分布式系统可以说会面对诸多挑战,这不只是 Python 会遇到的,使用别的语言也会碰到,但是呢,Python 作为一个与 Java 等语言相比不够成熟的语言可能会面临一些其他可能已经在一些语言下解决了的问题,在 OpenStack 社区里就有人提过多次这个问题,为什么我们选择 Python,而非别的语言。

在我看来,一个大型软件的选型是一个复杂的事情,对于 OpenStack,可能第一是因为历史原因。因为我们知道 OpenStack 最早的源代码是 Rackspace 和 NASA 一起贡献的,他们当初内部的选择为我们建立了一个基调,如果再用其他语言重写的话,可能在当时是一个不合实际的考虑;再有,OpenStack 与其说是一个大型软件,倒不如说是一个框架,它的虚拟化来自于 KVM、Qemu 等的支持,它的网络来自于 Open vSwitch、iptables 等的支持,至于存储,也需要 lvm、Ceph 作为底层。那么 OpenStack 是干嘛的呢,它是一个总的调度器,集成这一切功能,完成一个真正的自由云计算软件。做运维的同学一般比较熟的语言都是 Shell、Python,老一点的可能熟悉 Perl,为什么?因为这些脚本语言,很适合做这种调度的工作,或者说它很适合做粘合剂,正如一些人称 Python 为“胶水语言‘一样,它能够方便的粘合各个组件,而且代码量相对少,可以让人专注于高层的事情,而不是为了底层费脑筋;再有,作为一个高级语言,Python 有着一些相对完美的特性,比如社区的有过提交的开发者有数千,活跃的开发者也有几百,为什么 OpenStack 能快速吸引这么多开发者,所有人都是之前就接触过 Python 么?不是的,很多人都是现学的,因为 Python 的基本语法真的很简单,只需要看一个晚上第二天就能阅读 OpenStack 基本的代码了,这对吸引开发者来说很有好处,就像为什么有些公司做项目首先考虑 Java,因为好招人啊!Python 作为一个学习曲线平滑的语言,可以说为吸引开发者带来很多方便。再有,反射、自省这些高级特性也不缺,这位开发带来了方便,丰富的库,比如Paste、Routes、requests、WebOb、alembic、Jinja2 等,更是提升前期效率的利器。

分布式系统中面临的问题

连接建立与服务初始化
事件分离与事件处理程序分派
IPC 与网络协议处理
静态和动态组件
并发与同步

Neutron 简介

因为很多人对 OpenStack 不那么熟,我就先简单介绍下 Neutron 是什么。Neutron 是 OpenStack 的虚拟网络组件,用洋气点的话说,就是一个 SDN 控制器。为什么我们需要虚拟网络?过去我们只给客户提供虚拟机,你花钱,我租你一台,想连接上就再买个公网 IP,就像很多人在 DigitalOcean 做得一样(当然 DigitalOcean 现在也有虚拟网络)。那有了虚拟网络可以干什么呢?我们来看一下 UStack 控制面板里的一张图:
Read More →

当初看 Dive into Python 的时候就听过装饰器,不过知道是个语法糖,感觉上没什么用,就没仔细了解,这几天看一段代码用到了装饰器,只好再研究下吧。

为什么使用装饰器?

AstralWind 在他的博客里这么说,“装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。”

打个比方,我是个有怪癖的人,在调用任何函数的时候总希望先输出函数的name和doc,因为我常常反复传递函数,所以最好把这个函数的引用计数也显示下?要么把函数运行时间也显示出来吧!

如果不用装饰器,我们可能在写函数的时候把name、doc什么的都print出来,这样有些麻烦,写多少个函数就得copy多少次,利用Python万物皆对象的特性,我们不妨写个函数来做这件事情:

不过这样在调用函数的时候总得先把函数传给PrintDetail(),既不美观也不方便,那么是时候让装饰器登场了:

这里我们定义了装饰器,不过,等等,我运行完发现怎么我还没调用func,他就运行了?
上面这个装饰器是不合格的,如果你尝试去掉用的话,甚至会发现装饰器只会调用一次。
这是因为我们还没弄清楚究竟什么时装饰器,我先提供一个正确的装饰器:

为什么要提供_PrintDetail,而且还要把它返回?
为什么现在看起来就不会没调用自动运行?
为什么现在多次运行都可以自动调用装饰器了?

虽然没有读过Python关于这部分的源码,但是大概可以推测出Python涉及到装饰器时怎么工作的:
Read More →

不知道有没有人喜欢用ctypes,反正我是不大喜欢的。用了ctypes之后程序会显得很凌乱——为了调用c/c++写的dll,动不动c_int或者c_char_p,要是碰上dll里各种用结构体或者数组或者指针的话,那更是悲剧了。想象下先写个c_char_p,然后再pointer(),然后组合起来一个struct,再排出个数组,最后还要获得其指针?

简直就是个悲剧,好了,吐槽完毕,下面说正经的,有一个数据采集仪,提供一个dll方便我们取数据,VC6.0下编译的,某个函数在文档中给出原型如下:

  1. // 功能描述:获取传感器的测量值。   
  2. // 输入参数:pSensorVal,用户分配的用来保存传感器值的数组首地址;   
  3. //           pSensorCount,用户分配的数组长度;   
  4. // 输出参数:pSensorVal,保存采集到的传感器的值;   
  5. //           pSensorCount,分析仪中的传感器数,如果分析仪中的传感器数大于用户指定的个数,则只返回用户指定个数的传感器值。   
  6. // 返 回 值:成功返回1;失败返回负数;   
  7. //           -1:获取失败   
  8. FBGA_DR_API int FBGA_GetSensorVal (SSensorVal *pSensorVal, int *pSensorCount);  

Read More →

本文由Mathematrix译自由Jake Vanderplas撰写的Matplotlib Animation Tutorial

Matplotlib 1.1 版新添加了一些非常帅的用来制作动画的工具,你可以在Matplotlib的Example页看到一些非常棒的例子(OldExample, Example)。在这里我与大家分享下我使用这些工具的一些经验。

基本动画

动画工具的中心是matplotlib.animation.Animation基类,这个类提供了动画功能的基础。两个主要接口则分别是imeAnimation和FuncAnimation,你可以在这里查看API文档。下面我说说怎么使用我认为最实用的FuncAnimation。

首先我们用FuncAnimation做一个基本的动画,这个动画可以在屏幕上动态显示正弦函数的图像。

  1. “””  
  2. matplotlib animation example  
  3.  
  4. author: jake vanderplas  
  5. email: vanderplas@astro.washington.edu  
  6. website: http://jakevdp.github.com  
  7. license: bsd  
  8. please feel free to use and modify this, but keep the above information. thanks!  
  9. “””  
  10.   
  11. import numpy as np   
  12. from matplotlib import pyplot as plt   
  13. from matplotlib import animation   
  14.   
  15. # first set up the figure, the axis, and the plot element we want to animate   
  16. fig = plt.figure()   
  17. ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))   
  18. line, = ax.plot([], [], lw=2)   
  19.   
  20. # initialization function: plot the background of each frame   
  21. def init():   
  22.     line.set_data([], [])   
  23.     return line,   
  24.   
  25. # animation function.  this is called sequentially   
  26. def animate(i):   
  27.     x = np.linspace(0, 2, 1000)   
  28.     y = np.sin(2 * np.pi * (x - 0.01 * i))   
  29.     line.set_data(x, y)   
  30.     return line,   
  31.   
  32. # call the animator.  blit=true means only re-draw the parts that have changed.   
  33. anim = animation.funcanimation(fig, animate, init_func=init,   
  34.                                frames=200, interval=20, blit=true)   
  35.   
  36. # save the animation as an mp4.  this requires ffmpeg or mencoder to be   
  37. # installed.  the extra_args ensure that the x264 codec is used, so that   
  38. # the video can be embedded in html5.  you may need to adjust this for   
  39. # your system: for more information, see   
  40. # http://matplotlib.sourceforge.net/api/animation_api.html   
  41. anim.save(‘basic_animation.mp4′, fps=30, extra_args=['-vcodec', 'libx264'])   
  42.   
  43. plt.show()  

 

让我们一步一步来研究这个并看看下面将会发生什么。在引入几个必须的numpy和matplotlib库后,脚本开始设置这个plot:
Read More →

本文程序在Windows7 + python2.7 + wx2.9 + pygame1.9 下调试正常通过。 这几天在给一座桥写实时监控程序(众:你丫去年不就在写这玩意儿么,怎么今年又写开了……答:去年写的是个检测,就相当于给数据做了个皮肤,今年做的是监测,连着几百号传感器呢,技术含量不能同日而语……)。出于种种目的我终于说服项目组允许我拿python写这个程序,以前就很少写GUI程序,这下自己也纯属赶鸭子上架,结果没想到还遇到了个麻烦。 是这样的,桥上有个传感器,可以感应到有车辆从桥上经过,这个传感器可以记录到这个车的车速、加速度、轴重、轴距等等信息,然后工控机1受到这些数据后会向局域网广播,我写的程序跑在工控机2上,收到数据在屏幕显示就行了,这个过程倒是不难,只要下面几句就能完成:

  1. s=socket.socket(socket.af_inet,socket.sock_dgram)   
  2. s.setsockopt(socket.sol_socket,socket.so_reuseaddr,1)   
  3. socket.setdefaulttimeout(0.5)   
  4. ip=socket.gethostbyname(socket.gethostname())   
  5. d,a=s.recvfrom(90)   
  6. s.close()  

 

因为这个数据什么时候发过来并不知道,所以应该开个线程然后while循环这句d,a=s.recvfrom(90),当收到数据就出发个事件,但是我研究好久线程间通信、事件什么的也没弄出来,只好写了个轮循,就是收到数据就放到一个大家都能访问的空列表里,在画动画的时候不断检查这个列表长度,一旦列表长度大于0就从里边取数据,取一个删一个。这样写好像比较笨,再看了“小明明s à domicile”里写的设计模式后发现这个其实符合观察者模式,与其不断查这个列表不如在收数据这里调用画动画的函数,这样来通知效果应该会好些。说起来,在Python Essential Reference里有个生产者消费者模型,记得以前看操作系统原理看过,可惜没用上。 收上数据直接显示应该就行了吧,这个本来挺简单但是项目组要求这个显示一定要用个动画来显示,具体就是来个车要能看到一个格子里面有这个车的所有信息,然后这个格子要从屏幕下方移动到屏幕上方,定住;下一个移动到这个之后,如此循环,当屏幕上攒够4个就把最上面那个移走,整体往上顶一个,再把新的移上来,大致就是怎么个效果:

Record Read More →