高效的 ACE Proactor框架

本文详细介绍了一个基于ACE框架的客户端处理类的设计与实现过程,包括如何使用ACE_Asynch_Read_Stream和ACE_Asynch_Write_Stream进行高效的异步I/O操作。
 
1WIN32下面用proactor可以达到几乎RAW IOCP的效率,由于封装关系,应该是差那么一点。
客户端处理类的常规写法:
//
处理客户端连接消息
class ClientHandler : public ACE_Service_Handler
{
public:
 /**
构造函数
  *
  *
  */
 ClientHandler(unsigned int client_recv_buf_size=SERVER_CLIENT_RECEIVE_BUF_SIZE)
  :_read_msg_block(client_recv_buf_size),_io_count(0)
 {
 }

 ~ClientHandler(){}
 /**
  *
初始化,因为可能要用到ClientHandler内存池,而这个池又不一定要用NEW
  */
 void init();
 /**清理函数,因为可能要用到内存池
  *
  */
 void fini();
//检查是否超时的函数
 void check_time_out(time_t cur_time);
public:
 /**客户端连接服务器成功后调用
  *
  * /param handle
套接字句柄
  * /param &message_block
第一次读到的数据(未用)
  */
//Acceptor来调用!!!
 virtual void open (ACE_HANDLE handle,ACE_Message_Block &message_block);
 /**处理网络读操作结束消息
  *
  * /param &result
读操作结果
  */
 virtual void handle_read_stream (const ACE_Asynch_Read_Stream::Result &result);

 /**
处理网络写操作结束消息
  *
  * /param &result
写操作结果
  */
 virtual void handle_write_stream (const ACE_Asynch_Write_Stream::Result &result);
private:
//**生成一个网络读请求
  *
  * /param void
  * /return 0-
成功,-1失败
  */
 int  initiate_read_stream  (void);
 /**生成一个写请求
  *
  * /param mb
待发送的数据
  * /param nBytes
待发送数据大小
  * /return 0
-成功,-1失败
  */
 int  initiate_write_stream (ACE_Message_Block & mb, size_t nBytes );
 
 /**
  *
  * /return
检查是否可以删除,用的是一个引用计数。每一个外出IO的时候+1,每一个IO成功后-1
  */
 int check_destroy();
 
 //
异步读
 ACE_Asynch_Read_Stream _rs;
 //异步写
 ACE_Asynch_Write_Stream _ws;
 //接收缓冲区只要一个就够了,因为压根就没想过要多读,我直到现在也不是很清楚为什么要多读,多读的话要考虑很多问题
 ACE_Message_Block _read_msg_block;
 //套接字句柄,这个可以不要了,因为基类就有个HANDLER在里面的。
 //ACE_HANDLE _handle;
 //一个锁,客户端反正有东东要锁的,注意,要用ACE_Recursive_Thread_Mutex而不是用ACE_Thread_Mutex,这里面是可以重入的,而且在WIN32下是直接的EnterCriticalSection,可以达到很高的效率
 ACE_Recursive_Thread_Mutex _lock;
 
 //
在外IO数量,其实就是引用计数啦,没啥的。为0的时候就把这个东东关掉啦。
 long _io_count;
//检查超时用的,过段时间没东东就CLOSE他了。
 time_t _last_net_io;
private:
//本来想用另外一种模型的,只用1个或者2个外出读,后来想想,反正一般内存都是足够的,就不管了。
 //ACE_Message_Block _send_msg_blocks[2];
 //ACE_Message_Block &_sending_msg_block;
 //ACE_Message_Block &_idle_msg_block;
private:
 
public:
//TODO:move to prriva and use friend class!!!
//只是为了效率更高,不用STLLIST是因为到现在我没有可用的Node_Allocator,所以效率上会有问题。
 ClientHandler *_next;
 ClientHandler *next(){return _next;}
 void next(ClientHandler *obj){_next=obj;}
};

//
这是具体实现,有些地方比较乱,懒得管了,锁的有些地方不对。懒得改了,反正在出错或者有瓶颈的时候再做也不迟。
void ClientHandler::handle_read_stream (const ACE_Asynch_Read_Stream::Result &result)
{
 _last_net_io=ACE_OS::time(NULL);
 int byterecved=result.bytes_transferred ();
 if ( (result.success ()) && (byterecved != 0))
 {
  //ACE_DEBUG ((LM_DEBUG,  "Receiver completed:%d/n",byterecved));
//处理完数据
  if(handle_received_data()==true)
  {
   //ACE_DEBUG ((LM_DEBUG,  "go on reading.../n"));
//把东东推到头部,处理粘包
   _read_msg_block.crunch();
   initiate_read_stream();
  }
 }
//这个地方不想用ACE_Atom_op,因为反正要有一个锁,而且一般都会用锁,不管了。假如不在意的话,应该直接用ACE_Atom_Op以达到最好的效率
 {
  ACE_Guard<ACE_Recursive_Thread_Mutex> locker (_lock);
  _io_count--;
 }
 check_destroy ();
}
void ClientHandler::init()
{
//初始化数据,并不在构造函数里做。
 _last_net_io=ACE_OS::time(NULL);
 _read_msg_block.rd_ptr(_read_msg_block.base());
 _read_msg_block.wr_ptr(_read_msg_block.base());
 this->handle(ACE_INVALID_HANDLE);
}
bool ClientHandler::handle_received_data()
{
...........自己处理
 return true;
}

//==================================================================
void ClientHandler::handle_write_stream (const ACE_Asynch_Write_Stream::Result &result)
{
 //
发送成功,RELEASE
 //
这个不可能有多个RELEASE,直接XX
 //result.message_block ().release ();
 MsgBlockManager::get_instance().release_msg_block(&result.message_block());
 {
  ACE_Guard<ACE_Recursive_Thread_Mutex> locker (_lock);
  _io_count--;
 }
 check_destroy ();
}
//bool ClientHandler::destroy ()
//{
// FUNC_ENTER;
// ClientManager::get_instance().release_client_handle(this);
// FUNC_LEAVE;
// return false ;
//}

int  ClientHandler::initiate_read_stream  (void)
{
 ACE_Guard<ACE_Recursive_Thread_Mutex> locker (_lock);
//考虑到粘包的呀
 if (_rs.read (_read_msg_block, _read_msg_block.space()) == -1)
 {
  ACE_ERROR_RETURN ((LM_ERROR,"%p/n","ACE_Asynch_Read_Stream::read"),-1);
 }
 _io_count++;
 return 0;
}
/**生成一个写请求
*
* /param mb
待发送的数据
* /param nBytes
待发送数据大小
* /return 0
-成功,-1失败
*/
int  ClientHandler::initiate_write_stream (ACE_Message_Block & mb, size_t nBytes )
{
 ACE_Guard<ACE_Recursive_Thread_Mutex> locker (_lock);
 if (_ws.write (mb , nBytes ) == -1)
 {
  mb.release ();
  ACE_ERROR_RETURN((LM_ERROR,"%p/n","ACE_Asynch_Write_File::write"),-1);
 }
 _io_count++;
 return 0;
}
void ClientHandler::open (ACE_HANDLE handle,ACE_Message_Block &message_block)
{
 //FUNC_ENTER;
 _last_net_io=ACE_OS::time(NULL);
 _io_count=0;
 if(_ws.open(*this,this->handle())==-1)
 {
  ACE_ERROR ((LM_ERROR,"%p/n","ACE_Asynch_Write_Stream::open"));
 }
 else if (_rs.open (*this, this->handle()) == -1)
 {
  ACE_ERROR ((LM_ERROR,"%p/n","ACE_Asynch_Read_Stream::open"));
 }
 else
 {
  initiate_read_stream ();
 }
 check_destroy();
 //FUNC_LEAVE;
}
void ClientHandler::fini()
{
}
void ClientHandler::check_time_out(time_t cur_time)
{
 //ACE_Guard<ACE_Recursive_Thread_Mutex> locker (_lock);
 //ACE_DEBUG((LM_DEBUG,"cur_time is %u,last io is %u/n",cur_time,_last_net_io));
 //检测是否已经为0
 if(this->handle()==ACE_INVALID_HANDLE)
  return;
 if(cur_time-_last_net_io>CLIENT_TIME_OUT_SECONDS)
 {
  ACE_OS::shutdown(this->handle(),SD_BOTH);
  ACE_OS::closesocket(this->handle());
  this->handle(ACE_INVALID_HANDLE);
 }
}
int ClientHandler::check_destroy()
{
 {
  ACE_Guard<ACE_Recursive_Thread_Mutex> locker (_lock);
  if (_io_count> 0)
   return 1;
 }
 ACE_OS::shutdown(this->handle(),SD_BOTH);
 ACE_OS::closesocket(this->handle());
 this->handle(ACE_INVALID_HANDLE);
//这个地方给内存池吧。
 ClientManager::get_instance().release_client_handle(this);
 //delete this;
 return 0;
}
 
 
内容概要:本研究聚焦于绿电直连型电氢氨园区的优化运行,提出一种集成绿色电力直接供给、电解水制氢及氢气合成氨工艺的综合能源系统架构。通过建立包含风光发电、电解槽、氨合成反应器、储氢罐、电网交互及多类型负荷在内的系统模型,综合考虑绿电直供优先、能量梯级利用与多能互补原则,构建以系统综合运行成本最小化为目标的优化调度模型。研究采用Matlab与Python工具进行算法求解和仿真分析,利用实际气象与负荷数据完成案例验证,评估了不同运行策略下系统的经济性、可再生能源消纳能力与碳减排效益,为新型电氢氨一体化园区的规划与运行提供了理论依据和技术支撑。; 适合人群:具备一定电力系统、新能源或化工背景的研究生、科研人员及从事综合能源系统规划与优化工作的工程技术人员。; 使用场景及目标:①用于科研学习,理解电-氢-氨多能转换系统的建模与优化方法;②为工业园区的低碳化、智能化改造提供技术参考与决策支持;③作为开发类似综合能源管理系统的理论基础。; 阅读建议:此资源包含完整的模型代码、数据与论文,使用者应结合代码仔细研读论文中的模型构建部分,重点关注目标函数与约束条件的设计逻辑,并尝试修改参数进行仿真,以深入掌握优化算法在实际系统中的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值