Pulpcode

捕获,搅碎,拼接,吞咽

0%

虽然tornado是一个不错的web服务器,但是在真实的生产环境,我们还是会布置多份,而且一般情况下,份数和cpu核数一样。

首先一个重要的原因是单线程的tornado,在遇到同步的堵塞请求时,会使整个服务都停到那里,这样你就无法在处理新的请求,所谓的同步请求,就是类似数据库查询,
或者是磁盘访问块。

nginx

之前在介绍flask的部署方式时,已经提到nginx的好处了,nginx本身是一个更安全,更专业的服务器,而且对静态资源也有更好的支持,在加上机器上还有其它的web服务要管理,那nginx自然是最好的选择了。

基本流程是:客户端通过Internet连接一个反向代理服务器,然后反向代理服务器发送请求到代理后端的Tornado服务器池中的任何一个主机。

阅读全文 »

flask自带的web server仅仅能用于开发,因为它本身就不是一个web服务器,而是一个web 框架,这和tornado刚好是相反的。

这时候我们需要一个生产的部署方案,mod_wsgi已经是过去时了,uwsgi已经算是现在标准的python web 部署方案了。

uwsgi可以使你的服务以多进程,多线程执行,但因为python的线程是有GIL的,所以一般在每个worker进程里面只有一个线程,而且维护一个数据库连接就行了,也无需使用连接池。

uwsgi将会对每一个请求开进程,这种进程并不是那种让你觉得很浪费资源的fork,这是一种被成为prefork的技术。也就是多线程池,会预先生成若干个进程来处理请求。 下面我们就来部署一个这样的webserver。

安装uwsgi

先写一个最简单的flask服务程序吧

阅读全文 »

使用python生成二维码需要用到qrcode库,但是此库会依赖到其它库,请按照如下步骤安装:

安装 pil

1
sudo easy_install pil

如果出现如下错误:

1
2
3
4
5
_imagingft.c:73:10: fatal error: 'freetype/fterrors.h' file not found
#include <freetype/fterrors.h>
^
1 error generated.
error: Setup script exited with error: command 'cc' failed with exit status 1

是因为Mac 下所依赖的 FreeType 链接变更问题,解决如下:

阅读全文 »

之前对多线程的一些问题一直无法理解,所以在各个论坛提出了此问题,这里将好的回复收集与此。

原问题

对于单核 cpu 而言,开多线程的目的难倒只能是为了防止阻塞么?

以下是一些单核 cpu 多线程的疑问,求解答(都指单核)。

  1. 如果一个进程有 n 个任务要处理,因为终究是在一个 cpu 上跑,所以这 n 个任务在一个线程还是多个线程上跑,执行的总时间是一样的(多线程,线程切换可能更浪费时间)?
  2. 是否进程开多线程就能抢到更多的 cpu 时间, python 这种带 GIL 的估计是没戏了,那么 java 呢?
  3. 自己抢到更多 cpu ,机器上的其它程序不就 cpu 时间少了么?是因为 cpu 大部分时间都是空闲的,不怕抢?还是因为在做应用层开发的时候,是不用考虑其它程序能不能抢到 cpu 时间的。
  4. 一个进程所有线程能抢到的时间片总和是有最大值吗?一个线程一次能拿到多长的 cpu 时间?

综上,我的最大疑问就是:对于单核 cpu 而言,开多线程难倒只能防止阻塞么?

阅读全文 »

Introduction

本来标题是“如何写出一个高质量的python代码”,后面想想,还是别夸自己了,没有那本事,标题就改为 “如何写出有质量的python代码”,我觉得更应该叫,写有一定质量的python代码。

实际上有质量的python代码是一个很大的话题,一本书估计都写不完,我仅仅自我总结而已。

多考虑前期需求分析和设计

之前的我花1天的时间设计,花一个多星期去实现,现在我花一个星期去做设计(uml和文档),花一两天去实现。这件事,编码的年龄越大,领悟越透彻。

写好异常

异常本身不算是python特有的,这本身算是编程的基本功了,那我就从异常本身和python特性两方面,来谈谈异常。

阅读全文 »

starting

树是一种非常重要的非线性结构。线性表,栈和队列相对简单。图呢,在目前项目中我几乎就没碰到过。
分叉的特性让其非常的容易用于查找,这篇博客是想总结一下b树和b+树。

查找树

按照数据结构书上的定义,查找的数据结构,分为静态查找表,动态查找表和哈希表。
首先静态查找表本身并不实用,因为不能动态的插入和删除元素,动态查找表中的二叉排序树和平衡二叉树又不符合真实的硬件场景。而b树和b+树才是真真确确被用到现实场景,比如mysql数据库引擎的InnoDB和MyISAM都使用了b+树,虽然在实现方式上可能稍有不同。

当你用python写了一个web应用,你就不得不将其布置到一个web的服务器上,这篇博客将列举下可以使用的web服务器有哪些。

在这之前先简单的介绍一下其它知识。

wsgi

WSGI 的官方定义是,the Python Web Server Gateway Interface

Gateway是一个网关。网关的作用就是在协议之间进行转换。
那么wsgi用来做什么之间的转换呢?它实际上定义一种协议,使得实现wsgi的web框架(app)和实现wsgi的web服务器可以进行“插拔”。
这就是为什么我之前的flask项目可以直接部署到tornado上去运行。所以说以下介绍的web服务器,之所以可以部署python的web项目,是因为它们都实现了wsgi。顺便说一句,wsgi这个思想,应该是从java的servlet中借鉴过来的。

阅读全文 »