请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

9-4 中关于注册时把 IoArgs 一同注册的缺点

  • 老师在课程中说:注册时连同 IoArgs 一起注册,意味着已经把通道打开了,这是为什么呢?
  • IoArgs 只是被传入 SocketChannelAdapter#outputCallbackattach 中,然后 outputCallback 存入 IoSelectorProvider#inputCallbackMap 中,为什么就会使通道打开了呢?
  • 截图如下:
    图片描述

正在回答

2回答

理论来说:SocketChannelAdapter 存在了那么Socket连接就已经建立好了。

到达IoSelectorProvider的时候已经进入到传输部分了,一旦IoSelectorProvider调度IoArgs的时候那么此时通道就已经就绪了。


不知道这是不是你要的答案,如果不是,麻烦你截图一下哈;我也怕理解错了你的点。

0 回复 有任何疑惑可以回复我~
  • 提问者 磊磊要酷酷滴 #1
    已在问题描述中加入截图,还请老师看一下。
    回复 有任何疑惑可以回复我~ 2019-05-03 18:42:52
  • Qiujuer 回复 提问者 磊磊要酷酷滴 #2
    不出意外的话 后面会讲解的,在这里还有一次优化,到时候会吧ioargs单独提出来;在这里只会注册回调,当就绪时触发回调,并进行数据处理。
    
    对于发送来说是可以向上面的那样,我们把ioargs携带进去,此时我们先假设输出通道已就绪,我们可以直接进行一次输出操作,如果输出失败再进行注册即可,这样的发送效率可以最大化。但是经过我的测试,我发现这个并不是完全100%的可行,特别是在Mac系统下,居然直接发送操作是阻塞的,通道没有就绪不会直接返回错误,而是持续等待。
    回复 有任何疑惑可以回复我~ 2019-05-03 21:58:02
  • 提问者 磊磊要酷酷滴 回复 Qiujuer #3
    谢谢老师!
    回复 有任何疑惑可以回复我~ 2019-05-03 23:17:27
none_nkn 2020-06-25 16:14:01

老师在课程中说:注册时连同 IoArgs 一起注册,意味着已经把通道打开了?

对于老师这句话我的理解是:通道指的是ReadableChannel或WritableChannel。即发送数据时连同IoArgs一起注册的话,则先需要打开一个ReadableChannel,使用args.readFrom(ReadableChannel channel)将数据读入IoArgs后再去注册。这样的流程可以描述为:【准备数据(打开通道)-->注册事件-->事件就绪-->处理数据】,即事件未就绪前就打开输入通道了。老师后面又说把打开通道延迟到事件就绪后,实际流程调整为:【注册事件-->事件就绪-->准备数据(打开通道)-->处理数据】。这样的理解如有不妥,期望一起交流喔。

0 回复 有任何疑惑可以回复我~
  • Qiujuer #1
    通道其实是一直打开的,只是在于什么时候使用而已。比如读取通道,你可以在事件未就绪的时候也去读取,但是此时读取不了数据,只是浪费CPU的空转。
    
    关于写通道也是一样,如果没有就绪时去做输出操作也是可以的,但是当计算机的网卡和内存之间的缓冲满载时,可能会输出直接阻塞。
    回复 有任何疑惑可以回复我~ 2020-06-28 09:46:56
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信