Archive: 2015

async源码阅读笔记

又是两周没写博客了,圣诞夜来水一发~今天稍微看了下async的源码,感觉很简短精炼,总共也才1000多行代码,好多值得学习的地方。主要看的是waterfall模块,由于源码中有好多不同接口公用的部分,因此看完waterfall这个接口的整个流程,差不多就cover了一半的async源码了。

谈谈项目的重构与测试

背景这几个月我开发了公司里的一个restful webservice,起初技术选型的时候是采用了flask框架。虽然flask是一个同步的框架,但是可以配合gevent或者其它方式运行在异步的容器中(测试链接),效果看上去也还可以,因此就采用了这种方式。 后面阅读了tornado的源码,也去了解了各种协程框架以及运行的原理。总感觉flask的这种同步方式编程不够好,同时对于这种运行在容器里的模式目前还缺乏了解。但至少现在对于tornado的运行原理有了一定的了解,如果用tornado写的话,是很可控的,而且可以保证运行是高效的。因此就决定把原来基于flask的项目用tornado重构了。

如何让进程后台运行——多种方案整理

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

python异步框架中协程之间的并行

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

leetcode212_字典树

水一篇文章。最近项目里在用字典树配合redis做搜索和字符串匹配,这部分不是我做的,但为了熟悉一下练练手,刷一道关于字典树的题目。纠结要不要把刷leetcode的题目搬上来,想想还是放上来吧,毕竟这题只有16%的通过率。况且字典树这个东西以后还是会经常用得到的,算是给自己以后留个参考吧。 题目地址 Word Search II 字典树、回溯法我觉得这题主要还是字典树。当然说回溯法也可以,毕竟在搜索的时候根据情况,适时停止,进入下一个分支。不过我觉得更合适的说法是在dfs中增加了条件判断而已。要说最经典的回溯问题,据我近两年的刷题经验来看,当属 八皇后 问题了,八皇后在leetcode中也有。

【译】深入理解python3.4中Asyncio库与Node.js的异步IO机制

译者: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的源码,对于它的异步事件机制还是有一个大致的轮廓的。虽然说让自己写一个类似的机制去实现异步事件比较麻烦,但也并不是完全没有思路。

mongodb集群(一)——搭建

1.前言之前有一篇博客是介绍了搭建mongodb的replica set集群的。这次系列将会对mongodb做一个更为详细的介绍,这篇主要讲的是mongodb数据分片集群的搭建。 分片(sharding)、副本集(replication)与分布式文件系统(比如 hbase)的区别: 副本集集群中的每一个节点的数据都是相同的,有一个primary,1~7个secondary,数据写入primary节点后会同步给所有的备份节点,可以很方便地作读写分离。还有一个可选的arbitary节点,当primary节点宕机后,由arbitary节点从secondary中选出新的primary节点。如果没有arbitary,则由所有secondary节点共同决定下一个primary节点。 数据分片集群中,每一个数据节点存的数据都是不同的,互作补充。由预先定义的字段或者组合字段作为分片的依据。往集群中新增分片节点,数据库会自动作数据迁移,使得存储负载尽可能平均。(某个节点挂了,部分数据访问不了怎么办,如何作数据的高可用?) 分布式文件系统是文件系统,数据库是一种定义的数据存储格式。数据库的数据在文件系统中也是以多个文件的形式存储的,而文件就是存储在文件系统中的。

期望最大化(EM)算法matlab实现

一、前言看了吴军博士的《数学之美》感觉受益颇多,好书!第二版第27章讲的是期望最大化(EM)算法,看完就感觉如醍醐灌顶,而且原理上也不难,趁国庆的机会,把它实现了,加深一下理解。 EM算法 的范畴很广,之前几章的 最大熵算法、隐含马尔科夫模型的训练算法 都包括在内。用它做一些文本的自收敛分类效果很好,而且运算复杂度也不高,是一个很不错的选择。当然,关于文本的分类,前几章也有介绍一些其它的算法,也可以去参考一下。

mysql mongodb性能测试

对mysql和mongodb做一个简单的调研。 测试环境数据库版本mongodb: 3.0.5 无任何优化,单机测试mysql: 5.6.26 无任何优化,单机测试 环境CPU: 2.2 GHz Intel Core i7内存: 16G DDR3操作系统: OS X Yosemite 10.10.5python: 3.5.0 数据库接口驱动mongodb: PyMongo 3.0.3mysql: PyMySQL 0.6.6

浅谈跨域问题

跨域问题相信不少朋友都遇到过,八仙过海各显神通,解决的方法也有很多种,那我今天也来稍微扯一扯。 问题重现先用nodejs写一个最简单的web后台12345678910// server.jsvar 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/');