Zhao Zi Chao

Results 7 comments of Zhao Zi Chao

[https://github.com/sogou/workflow/blob/master/docs/tutorial-09-http_file_server.md](url) 文档中提到"我们正在研发一套文件管理,将来用户只需要传入文件名,对跨平台更友好" 为什么不将WFTaskFactory::create_pread_task中的第一个参数fd改为std::function来作为一个回调函数 这样create_pread_task中new WFFilepreadTask后调用 平台相关的文件接口打开文件,并将文件相关信息作为参数传给回调函数 用户可以在回调函数中判断如何修改自己的读取参数,还可以判断是否继续 根据返回值我们可以让 Task成为一个bad Task直接去结束自己 好处是用户不需要再自己去调用open CreateFile这类平台相关的函数来打开文件

嗯....传文件名字作为参数,那现在在读取前,仍然不知道文件的大小和相关信息,这代表create_pread_task前还是要先打开文件获取到文件大小再调用create_pread_task来读取。这难道不会导致create_pread_task使用文件名字作为参数没有意义嘛

所以说我提出将一个回调作为参数,然后文件名也作为参数 这样我们在实现文件中通过平台相关api打开文件后,可以让用户处理接下来的操作,比如具体申请多大的内存 好处是我们将所有的与平台有关的内容都写到了cpp中,隐藏了真实的文件打开流程,方便用户编写跨平台代码。 这个需求其实是很现实的,需要考虑的是怎么优雅的实现,你可能更介意std::fun的不太好看,hahahah

能不能麻烦解释下IOService中的各个成员的作用 包括: int init(unsigned int maxevents);中的maxevents参数 virtual void handle_stop(int error) { } virtual void handle_unbound() = 0; private: void incref(); void decref(); private: int event_fd; int ref;

> 能不能麻烦解释下IOService中的各个成员的作用 包括: int init(unsigned int maxevents);中的maxevents参数 virtual void handle_stop(int error) { } virtual void handle_unbound() = 0; private: void incref(); void decref(); private: int event_fd; int ref; 目前我已经理解了框架中的task如何提交到Service这种运作方式。 但是还不清楚框架源码里面的其他机制,比如单个IOSession被Service处理完成后task所在的series是如何确定它被执行完毕的...

> IOService和series是两个层次的东西。最好不用混着一起看。如果你想实现iocp下的文件aio,只需要实现iocp版IOService和IOSession的接口就可以了。但这个真的挺难的。 使用上IOSerive被io_bind到Communitor,就可以通过IOService::request接口提及IOSession。而IOService使用结束后,需要调用Communicator::io_unbind。unbind过程又是异步的,unbind完成之后,IOService::handle_unbound会被调用,对象归还给外部。 已经绑定在Communicator上的IOService如果停止工作,IOService::handle_stop会被调用。停止工作有两种原因,一种是发生错误(stop的错误码为errno),另一种是Communiator::deinit()被调用(stop错误码为0)。handle_stop被调用时,IOService并未解绑,依然需要调用Communicator::io_unbind来解绑IOSerivce。 这部分代码逻辑太复杂了,几乎没有办法文字描述清楚。你有兴趣可以看看代码。IOService_thread的实现简单一些,当IOSession被请求是,实时创建一个线程进行IO。 另外,IOService和用于网络服务的CommService接口上是几乎一致的。IOService的请求来自本地调用,CommSession来自网络连接。 收到,阅读源码过程中最不好理解的就是这个部分,现在有了你的描述就好说了