华子的代码空间

逆水行舟,不进则退。 关注系统编程、网络编程、并发、分布式。

2012年7月23日

关于gevent

摘要: 首先,gevent是一个网络库:libevent是一个事件分发引擎,greenlet提供了轻量级线程的支持。所以它不适合处理有长时间阻塞IO的情况。gevent就是基于这两个东西的一个专门处理网络逻辑的并行库。1. gevent.spawn启动的所有协程,都是运行在同一个线程之中,所以协程不能跨线程同步数据。2. gevent.queue.Queue 是协程安全的。3. gevent启动的并发协程,具体到task function,不能有长时间阻塞的IO操作。因为gevent的协程的特点是,当前协程阻塞了才会切换到别的协程。如果当前协程长时间阻塞,则不能显示(gevent.sleep(0),或 阅读全文

posted @ 2012-07-23 15:26 华子的代码空间 阅读(1875) 评论(0) 推荐(0) 编辑

[转]网络服务器中生产者/消费者模型中的队列问题

摘要: 感谢大熊同学为我解惑,这篇帖子的原创权属于大熊。多线程模型的网络服务器中,一般有专门的网络IO线程,将请求放到请求队列中,此为生产者。然后多个工作线程从队列中获取其中一个请求,进行处理,此是消费者。通常,通讯使用的队列为锁无关队列。且,为了避免CPU耗慢,当工作线程发现队列为空的时候,要睡眠一会儿。要命的问题就出在这个睡眠上:1、假设睡眠的时间是10ms,则当队列为空时,所有工作线程都陆续进入睡眠状态;2、假设工作线程睡眠期间来了请求,则可能队列中的所有请求都会被延迟10ms才能处理到;3、在整个服务器的运行周期里,队列为空的几率非常大,因此导致工作线程睡眠的几率也非常大。毫无疑问,用以上的方 阅读全文

posted @ 2012-07-23 01:48 华子的代码空间 阅读(397) 评论(0) 推荐(0) 编辑

[转]服务器开发架构模式

摘要: 我看过最坑爹的模式的书,莫过于《数据访问模式》。读数据库和写DAO这样简单的事情,搞个蛋疼的模式,可怜我这种傻子乖乖地做了笔记,把重点一一进行了誊写。受到伤害的我决定报复,于是我总结出了《服务器开发架构模式》:1.读写分离模式 如果是DB,可以从slave读,写到master上。两台数据库可以针对读写的不同需求而进行优化,性能加倍。缺点是,数据同步可能有延迟。 对于进程:比如业务需求是从cache读写数据,则可以分为读写进程。 1.1 .职责的分离,读进程和写进程各自的业务逻辑变得很简单,足够小足够清晰,性能高,不容易出BUG。缺点是可能代码量比合在一起高一些; 1.2 针对读写的业务特点和请 阅读全文

posted @ 2012-07-23 01:36 华子的代码空间 阅读(325) 评论(0) 推荐(0) 编辑

python实现简单消息总线

摘要: 一句话概括:其实核心就是用了回调机制。 1 class PyBus (object): 2 3 def __init__(self,): 4 self.clear() 5 6 def clear(self): 7 self.subscriptions = {} 8 9 def subscribe(self, subject, owner, func):10 if not self.subscriptions.has_key(owner):11 self.subscrip... 阅读全文

posted @ 2012-07-23 01:27 华子的代码空间 阅读(1325) 评论(0) 推荐(0) 编辑

导航