Tag: python

浅析tornado协程运行原理

前言去年有一段时间一直在研究各种python协程框架,包括gevent, asyncio, tornado。阅读tornado的源码还是两个多月前的事了,一直想写一篇文章出来整理整理,但不知道从何处开始下笔。如果贴上一段段源码,然后通过语言来描述各种流程,这种类型的文章网上也有不少,况且这样子的讲解对于读者来说可能会比较乏味。

celery初探

背景及介绍最近接触一个项目,用到了celery, 故对其作一个学习和了解。celery是一个基于Python开发的并行分布式框架,在github上可以找到。

谈谈项目的重构与测试

背景这几个月我开发了公司里的一个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等。

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

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

python调用C++ —— ctypes库尝试

python调用c++有很多种方法,今天我就来整理使用一下python中ctypes模块的用法。 网上可以找到很多关于ctypes的使用资料,但都不全:1.类型介绍不完整2.只有python传入c++参数3.只有python接收c++返回我就针对以上的问题,作一个比较全面的使用介绍吧。 使用很简单,各种拼拼凑凑,看代码就可以懂,就不多说了。

threadpool in python

用python实现了一个简易的线程池对于线程池的不用应用场景对如下几个feature作了分类1.按工作总量分 工作总量已知: 需要计算的工作在threadpool启动之前就已经定了,对于threadpool只需要指定线程数量就好了,此类threadpool的工作流程如下,在启动前设置好线程池的大小,分割好子工作放入workers列表中,每个线程每次循环从列表中取出一个工作去做,如果列表已空,该线程退出。 这类线程池是最容易实现的一种,只需用一个互斥锁对workers队列做一个互斥访问即可