如何解决协程冲突的问题

2023/07/20381 浏览综合
有时候你们会遇到这种报错cannot wrap coroutine by main thread!!!
(即使现在没遇到,以后也会遇到的[嗒啦啦4_坏笑]
意思是主线程中不能包裹协程。
协程是啥呢,百度一下虽然能得到结果,但有些没有基础的萌新可能看不懂。
但我们不需要懂,只需要知道,当发生这种错误的时候,如何解决就可以了。
你只需要理解,这个报错是告诉你,一段语句中包含了一个协程,但这段语句是不能包含协程的。
那怎么办呢?办法就是把这个协程分离出去。
如何分离这个协程呢?
首先,要找到这个协程在哪里。报错会告诉你哪里包含了这个协程。比如下面这个报错,就告诉我在我的函数“广告云处理”中,包含了这个协程:
common/base/co.lua:41: cannot wrap coroutine by main thread!!!
stack traceback:
[C]: in function 'error'
common/base/co.lua:41: in function <common/base/co.lua:37>
(...tail calls...)
tds_score/use_mysql.lua:125: in field 'commit'
common/base/tds_score.lua:21: in method 'commit'
array_ec1b/trigger_module_main.lua:9486: in method '广告云处理'
array_ec1b/trigger_module_main.lua:9520: in upvalue 'cb'
common/base/ad/init.lua:18: in function <common/base/ad/init.lua:15>
然后,重点来了,如何把这个协程分离?
很简单,自定义一个事件A,在原来执行这个协程的地方,删掉执行协程的语句,发送这个事件A。
再然后,新建一个事件A的触发器,在这个触发器里执行这个协程。
比如下图,我新建了一个“广告奖励事件”,并在原来执行广告云处理的地方,发送这个事件:
TapTap
红框处原来执行了广告云处理等包含协程的语句
然后我新建了一个监听“广告奖励事件”的触发器:
TapTap
之前写在上上图红框中的语句都移到了这个触发器里
这样,我们就通过发送自定义事件,把协程从主线程中分离了出来。
总结一下:发送自定义事件,然后用触发器监听这个事件,就可以从主线程中分离出相应的协程。
你学费了吗?
4
2
1