skynet踩坑记录(三)skynet.call的挂起实际中可能造成的后果。

本文记录了在使用Skynet时遇到的关于`skynet.call`挂起问题及其引发的并发顺序错误。通过案例分析,解释了lua协程的工作原理,提出了解决方案:使用消息队列`skynet.queue`来保证执行顺序。同时强调了在处理重要数据时,对协程挂起理解的重要性。
摘要由CSDN通过智能技术生成

       在刚开始使用skynet的时候,就已经知道call方法会挂起。但是一直到今天,都无法深刻理解这个挂起的意思。直到碰到了这个问题。解决后做此记录。

       1.先描述一下出现的情况。

        

       先暂且不管为什么要对db进行这么多次操作(原因太多)。在这个需求下,我本是想执行顺序为 1234,但是实际上确时1324。这会导致3拿到的是2更新之前的数据。今日参加次数就会在执行4的时候,没有能更新到2更新的内容。

       2.为什么会出现这样的情况呢。

       首先要了解 lua协程。在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。一般使用协程的时候,因为cpu的性能问题,会让我们感觉和多线程差不多。但是重点就是,同一时刻,只有一个协程在运行,而且在他让出cpu的时候,cpu才回去处理别的协程。

       在上面的情况下,就是因为在步骤1的时候,调用了skynet.call。这个东西会挂起协程,也就是让出cpu。然后cpu就是处理了下面的协程,所以先调用了3。

       3.怎么处理

       有两个方法:a.修改业务,将这两个增加写到一起。

                            b.使用消息队列,skynet.queue。(代码很简单,就几行,即处理完当前协程的方法再调用下一个协程的方法)࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值