背景

这几个月我开发了公司里的一个restful webservice,起初技术选型的时候是采用了flask框架。虽然flask是一个同步的框架,但是可以配合gevent或者其它方式运行在异步的容器中(测试链接),效果看上去也还可以,因此就采用了这种方式。

后面阅读了tornado的源码,也去了解了各种协程框架以及运行的原理。总感觉flask的这种同步方式编程不够好,同时对于这种运行在容器里的模式目前还缺乏了解。但至少现在对于tornado的运行原理有了一定的了解,如果用tornado写的话,是很可控的,而且可以保证运行是高效的。因此就决定把原来基于flask的项目用tornado重构了。

阅读全文 »

前言

相信对服务端有所了解的同学对于如何让进程后台运行这个问题都有自己的处理方式,本人零零散散也知道一些方法,但偶尔也会陷入搞混的情况(知其然但不知其所以然,命令就这么用呗,也就不管为什么了)。加上近期有不止一个技术还不错朋友在跟我交流中对于如何处理这个问题产生了一些困惑,我想它可能是一个比较普遍存在的问题,因此打算较为系统地整理一下各种八仙过海的神通,同时也稍微扯一扯一些进程信号的问题。

阅读全文 »

前言

python中的异步协程框架有很多,比如 tornado, gevent, asyncio, twisted 等。协程带来的是低消耗的并发,在等待IO事件的时候可以把控制权交给其它的协程,这个是它并发能力的保障。但是光有并发还是不够的,高并发并不能保证低延迟,因为一个业务逻辑的流程可能包含多个异步IO的请求,如果这些异步IO的请求是一个一个逐步执行的,虽然server的吞吐量还是很高,但是每个请求的延迟就会很大。为了解决这类问题,每个框架都有各自不同的方式,下面我们就来分别看看,它们都是怎么管理互不相关协程之间的并行的。

如果对于异步IO不了解的朋友,可以先去了解下相关资料:epoll, select, aio等。

阅读全文 »

水一篇文章。最近项目里在用字典树配合redis做搜索和字符串匹配,这部分不是我做的,但为了熟悉一下练练手,刷一道关于字典树的题目。
纠结要不要把刷leetcode的题目搬上来,想想还是放上来吧,毕竟这题只有16%的通过率。况且字典树这个东西以后还是会经常用得到的,算是给自己以后留个参考吧。

题目地址

字典树回溯法
我觉得这题主要还是字典树。当然说回溯法也可以,毕竟在搜索的时候根据情况,适时停止,进入下一个分支。不过我觉得更合适的说法是在dfs中增加了条件判断而已。
要说最经典的回溯问题,据我近两年的刷题经验来看,当属 八皇后 问题了,八皇后在leetcode中也有。

阅读全文 »

译者:xidui
原文: http://sahandsaba.com/understanding-asyncio-node-js-python-3-4.html

译者前言

  • 如何用yield以及多路复用机制实现一个基于协程的异步事件框架?
  • 现有的组件中yield from是如何工作的,值又是如何被传入yield from表达式的?
  • 在这个yield from之上,是如何在一个线程内实现一个调度机制去调度协程的?
  • 协程中调用协程的调用栈是如何管理的?
  • gevent和tornado是基于greenlet协程库实现的异步事件框架,greenlet和asyncio在协程实现的原理又有什么区别?

去年稍微深入地了解了下nodejs,啃完了 朴灵《深入浅出Node.js》,自己也稍微看了看nodejs的源码,对于它的异步事件机制还是有一个大致的轮廓的。虽然说让自己写一个类似的机制去实现异步事件比较麻烦,但也并不是完全没有思路。

阅读全文 »

1.前言

之前有一篇博客是介绍了搭建mongodb的replica set集群的。
这次系列将会对mongodb做一个更为详细的介绍,这篇主要讲的是mongodb数据分片集群的搭建。

分片(sharding)、副本集(replication)与分布式文件系统(比如 hbase)的区别

  • 副本集集群中的每一个节点的数据都是相同的,有一个primary,1~7个secondary,数据写入primary节点后会同步给所有的备份节点,可以很方便地作读写分离。还有一个可选的arbitary节点,当primary节点宕机后,由arbitary节点从secondary中选出新的primary节点。如果没有arbitary,则由所有secondary节点共同决定下一个primary节点。
  • 数据分片集群中,每一个数据节点存的数据都是不同的,互作补充。由预先定义的字段或者组合字段作为分片的依据。往集群中新增分片节点,数据库会自动作数据迁移,使得存储负载尽可能平均。(某个节点挂了,部分数据访问不了怎么办,如何作数据的高可用?)
  • 分布式文件系统是文件系统,数据库是一种定义的数据存储格式。数据库的数据在文件系统中也是以多个文件的形式存储的,而文件就是存储在文件系统中的。
阅读全文 »

一、前言

看了吴军博士的《数学之美》感觉受益颇多,好书!
第二版第27章讲的是期望最大化(EM)算法,看完就感觉如醍醐灌顶,而且原理上也不难,趁国庆的机会,把它实现了,加深一下理解。

EM算法 的范畴很广,之前几章的 最大熵算法隐含马尔科夫模型的训练算法 都包括在内。
用它做一些文本的自收敛分类效果很好,而且运算复杂度也不高,是一个很不错的选择。
当然,关于文本的分类,前几章也有介绍一些其它的算法,也可以去参考一下。

阅读全文 »

对mysql和mongodb做一个简单的调研。

测试环境

数据库版本

mongodb: 3.0.5 无任何优化,单机测试
mysql: 5.6.26 无任何优化,单机测试

环境

CPU: 2.2 GHz Intel Core i7
内存: 16G DDR3
操作系统: OS X Yosemite 10.10.5
python: 3.5.0

数据库接口驱动

mongodb: PyMongo 3.0.3
mysql: PyMySQL 0.6.6

阅读全文 »

跨域问题相信不少朋友都遇到过,八仙过海各显神通,解决的方法也有很多种,那我今天也来稍微扯一扯。

问题重现

先用nodejs写一个最简单的web后台

1
2
3
4
5
6
7
8
9
10
// server.js
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
console.log('I have received your request.');
res.end('Hello World\n');
}).listen(6022, "0.0.0.0");
console.log('Server running at http://0.0.0.0:6022/');
阅读全文 »

python调用c++有很多种方法,今天我就来整理使用一下python中ctypes模块的用法。

网上可以找到很多关于ctypes的使用资料,但都不全:
1.类型介绍不完整
2.只有python传入c++参数
3.只有python接收c++返回
我就针对以上的问题,作一个比较全面的使用介绍吧。

使用很简单,各种拼拼凑凑,看代码就可以懂,就不多说了。

阅读全文 »