Eve这传说中的神game早有听闻,而最近俺一个不小心,被它一篇初步公布自家IO技术的文章刺中了某条神经,于是开始去了解里面提到的stacklessIO;
然后,google大神表示,其实这货还没公布出来,OTL
再回头去查阅尽可能有关联的文章,个人观点着眼于,那些文章里提到的这种技术(stacklessIO),主要一个是可以利用起cpu的多核来分担单机上的IO消耗,另一个就是通过分布在多核上处理IO,提高单机的网络进出吞吐水平;
当然,eve里面的实现俺无从得知,他们用了自家的c实现去解决一些性能瓶颈问题,这也是俺这次蛋疼范围之外的东西,于是,根据俺的收集所得,还有之前刚好对stackless的使用经验,加上一定程度的头脑发热,开始动手山寨了:
目的:
目的很简单,在几乎纯python的范围内,山寨stacklessIO的策略,以单台计算机为单位,以集中式IO为使用实例做前提,提升它的利用率。
分析:
首先,因为俺不是搞纯理论或者模型分析,于是俺的实现工具被自己的习惯工具所限制:python,而且不做c扩展。
基于所选工具,就不得不提到python那GIL,有这东西在,要用上多核,俺想到的只有最原始的手段:multiprocessing;
然后就是进程间的通信手段,multiprocessing里面提供的进程间通信就算了,其它通信手段还有;
在这里,俺做一个简单的定义,从连接里接受信息的一方作为生产者(Producers),整合接受的信息的一方作为消费者(Consumer);
那么,模型的初步就是:
(Multi-core cup)
IO process(Producers)-----<----------->Main Process(Consumer)
|
... ------
当然,每一个生产者或者消费者,都是一个逍遥自在的进程,而且地位上,IO和Main其实可以说是对等的;
接下来,是进程间通信手段,进程间通信手段不止一种,multiprocessing也提供了进程间通信手段,自己YY一堆也可以;
这里由于旨在提高单机利用率,所以用了共享内存块;
于是:
(Multi-core cup)
IO process(Producers)---->(share memory)<----------->Main Process(Consumer)
|
... ------
然后,考虑到这个东西并不一定是一个项目的核心模块,只是一个供别人使用的工具,还需要考虑用户:
(Multi-core cup)
IO process(Producers)---->(share memory)<----------->Main Process(Consumer)<------>User
|
... ------
这样,模块的使用者,其实已经不需要直接面对网络方面的IO,他们只知道,有一堆数据从不知道哪里来了,要不停地处理,
更重要的是,从不知道哪里接受并塞进这些数据的处理消耗,并不需要由用户进程来负担。
末尾补充一点就是,既然叫stacklessIO,那么stackless就少不了,这不是仅仅为了了名字而用这个东西,
因为python各种微线程库里,stackless是个好东西,原始快速,缺点是它修改了python
(至于实际上修改了哪些东西俺这懒人没咋考究过,抱歉了),而且也太原始了,扩展库不多,
于是并不是那么好使好用的一个工具;
实际上用的是stackless socket,在此向stackless socket隆重致谢;
不过对于俺来说,原始快速就够了;事实上,每一个IO process进程里,stackless socket的表现非常不错;
于是俺也不好意思再对人家做什么封装,原始直接暴力地用上去就是了,
于是,最终出来的简模:
(Multi-core cup)
stackless-socket process(Producers)---->(share memory)
|
stackless-socket process(Producers)---->(share memory)
| <----------->Main Process(Consumer)<------>User
stackless-socket process(Producers)---->(share memory)
|
... ------>
然后,google大神表示,其实这货还没公布出来,OTL
再回头去查阅尽可能有关联的文章,个人观点着眼于,那些文章里提到的这种技术(stacklessIO),主要一个是可以利用起cpu的多核来分担单机上的IO消耗,另一个就是通过分布在多核上处理IO,提高单机的网络进出吞吐水平;
当然,eve里面的实现俺无从得知,他们用了自家的c实现去解决一些性能瓶颈问题,这也是俺这次蛋疼范围之外的东西,于是,根据俺的收集所得,还有之前刚好对stackless的使用经验,加上一定程度的头脑发热,开始动手山寨了:
目的:
目的很简单,在几乎纯python的范围内,山寨stacklessIO的策略,以单台计算机为单位,以集中式IO为使用实例做前提,提升它的利用率。
分析:
首先,因为俺不是搞纯理论或者模型分析,于是俺的实现工具被自己的习惯工具所限制:python,而且不做c扩展。
基于所选工具,就不得不提到python那GIL,有这东西在,要用上多核,俺想到的只有最原始的手段:multiprocessing;
然后就是进程间的通信手段,multiprocessing里面提供的进程间通信就算了,其它通信手段还有;
在这里,俺做一个简单的定义,从连接里接受信息的一方作为生产者(Producers),整合接受的信息的一方作为消费者(Consumer);
那么,模型的初步就是:
(Multi-core cup)
IO process(Producers)-----<----------->Main Process(Consumer)
|
... ------
当然,每一个生产者或者消费者,都是一个逍遥自在的进程,而且地位上,IO和Main其实可以说是对等的;
接下来,是进程间通信手段,进程间通信手段不止一种,multiprocessing也提供了进程间通信手段,自己YY一堆也可以;
这里由于旨在提高单机利用率,所以用了共享内存块;
于是:
(Multi-core cup)
IO process(Producers)---->(share memory)<----------->Main Process(Consumer)
|
... ------
然后,考虑到这个东西并不一定是一个项目的核心模块,只是一个供别人使用的工具,还需要考虑用户:
(Multi-core cup)
IO process(Producers)---->(share memory)<----------->Main Process(Consumer)<------>User
|
... ------
这样,模块的使用者,其实已经不需要直接面对网络方面的IO,他们只知道,有一堆数据从不知道哪里来了,要不停地处理,
更重要的是,从不知道哪里接受并塞进这些数据的处理消耗,并不需要由用户进程来负担。
末尾补充一点就是,既然叫stacklessIO,那么stackless就少不了,这不是仅仅为了了名字而用这个东西,
因为python各种微线程库里,stackless是个好东西,原始快速,缺点是它修改了python
(至于实际上修改了哪些东西俺这懒人没咋考究过,抱歉了),而且也太原始了,扩展库不多,
于是并不是那么好使好用的一个工具;
实际上用的是stackless socket,在此向stackless socket隆重致谢;
不过对于俺来说,原始快速就够了;事实上,每一个IO process进程里,stackless socket的表现非常不错;
于是俺也不好意思再对人家做什么封装,原始直接暴力地用上去就是了,
于是,最终出来的简模:
(Multi-core cup)
stackless-socket process(Producers)---->(share memory)
|
stackless-socket process(Producers)---->(share memory)
| <----------->Main Process(Consumer)<------>User
stackless-socket process(Producers)---->(share memory)
|
... ------>