花了一个多星期的时间,终于把一个基于IOCP的服务器基本完成了.
先说说功能吧(正兴奋着呢).这个服务器是一个TCP服务器,支持python脚本编写上层逻辑,拥有比较简单的一个内存管理,使用CPU个数的工作线程. python脚本是嵌入在C代码中的.
需要改进的部分有: 1.内存管理,2.更加精确的对socket的管理
开发感悟:
首先来说下IOCP,这个东西比EPOLL稍微复杂一些,其实学明白了以后也就觉得不难了,只不过是刚开始的时候我不知道有重叠IO这个概念,知道了这个概念以后,就好多了.
然后比较棘手的一个问题就是python的嵌入了.python的嵌入的主要问题就是多线程同时回调,另外一个就是引用记数的正确控制.
我在网上查的时候发现很多人都对python嵌入后多线程回调这个问题很头疼.python本身这个方面感觉做的确实不是特别好,因为他的GC里面好象没有直接有这方面的控制,而需要用户在代码中加锁.用户首先需要调用PyEval_InitThreads()函数来进行对多线程支持的初始化,然后在线程中加入PyGILState_Ensure()和PyGILState_Release(state),只有在这两个函数之间调用python操作才是安全的,不然经常就会发现python的gc抛出fatal error.按照上面说的做了以后,程序就可以正确的执行了.但是本人还是觉得这是一个很大的问题.根据我的观察PyGILState_Ensure()和PyGILState_Release(state)之间的代码的执行应该是不能同时执行的,或者是同时执行的很少.这样就导致了由完成端口管理的线程池中的线程,在python逻辑函数的调用部分就是串行的,而处理中最耗时间的部分却正好就是python逻辑函数了.所以这是个弊病,但目前还不知道应该怎么处理.
内存管理方面,我用的方法比较简陋,准备有时间的话就好好的改进一下.毕竟一个好的服务器,内存管理的好坏是有决定性作用的.目前的方法就是归还复用的方法,用一个内存池来管理分配和回收内存,所分配的内存都是固定大小的内存块.
不过,至少目前已经有一个有点象样的东西可以用了,还是很开心的.
后面还要更加努力,努力成为高手