-
Notifications
You must be signed in to change notification settings - Fork 164
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
syncx: sync.Cond的超时等待版,Cond.WaitWithContext(ctx) #192
Conversation
@fifth-month 根据 https://ekit.gocn.vip/contribution/ 修一下下面的错误 |
Codecov Report
@@ Coverage Diff @@
## dev #192 +/- ##
==========================================
+ Coverage 95.42% 95.53% +0.11%
==========================================
Files 50 51 +1
Lines 2642 2757 +115
==========================================
+ Hits 2521 2634 +113
- Misses 93 95 +2
Partials 28 28
... and 1 file with indirect coverage changes 📣 We’re building smart automated test selection to slash your CI/CD build times. Learn more |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
总体上来说,这就是之前我说的一个等待者一个 chan 的实现,类似于 sql.DB 这种连接池的设计。核心缺陷就是如果等待者很多,这里会创建很多 chan,倒也可以接受。
@longyue0521 请帮忙看看这边的并发问题。
整体上移除了notifyItem的结构,方法打散在了notifyList中。修改了部分测试,增加验证了超时控制的情况下唤醒的有序性 |
方法的使用注释加好了,基本上参考了sync.Cond的注释 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
虽然有点坑,但是我还想说,换成中文写注释,因为我这个首要考虑我们中国人能读懂。翻译软件那么发达,老外自己想用就自己翻译。而且……正常来说中国人的开源项目比较难得到老外的认可,所以不需要考虑英文。你看我们的文档、注释和错误信息全部都是中文……
@fifth-month 我暂时关了这个合并请求,你在企业微信或者邮箱给我发一个邮件,我有点小问题问你一下=。=不好意思了 |
我一直在强调并确认 场景分析:
当前实现在场景3和4中对外的逻辑语义是 那么wait(ctx)的返回值到底表示什么?为什么是error类型。 我认为 |
你说的意思,我懂,语义的问题确实是存在的,但是我个人觉得这个调度机制本身就没办法去保证一定是实时的问题,就算你 |
不过你说的返回bool确实感觉会更合理点,我觉得这里Wait(ctx) bool返回true代表条件有了变化被唤醒,false代表条件没有变化被唤醒(也就是超时而唤醒的)。 @flycash @longyue0521 |
@fifth-month 按照这个语义调整一下你的代码。 |
调整好了,现在是超时收到正常信号,会传递给下一个队首. |
@fifth-month 每修改一处后点击resolve conversion将相应对话框关闭。 |
@fifth-month 你还准备继续这个PR吗? |
应该不急吧,还得等几天 |
本来是想实现一个简版的linkedlist,然后配合notifyList使用,但是发现链表元素在移除的时候回收和channel的回收不同步进行,会导致死锁,索性干脆把chan直接挪入linkedlist的实现里面改成了chanList的一个特定实现,只为了这个模块而存在的一个channel的双链表。 |
增加了运行时拷贝检测,修正了初始化体验,尽可能保证初始化使用方式和官方Cond一致(支持syncx.Cond{L:sync.Locker}) |
Signed-off-by: Ming Deng <[email protected]>
整体思路是每一个等待的对象都创建一个chan,然后监听chan和ctx的信号;被通知时,如果先进入了超时分支,但同时被signal通知时,由于select会随机选择一个,但是被signal通知也就意味着成功了,只是同时超时了而已,所以超时后需要先加锁,然后再判断是否被通知过,如果被通知过,就直接返回,否则进入超时的真正流程,移除等待的对象。