【Lua坑】Lua协程coroutine无法正常完整执行问题

问题:发现Lua协程执行到一半,突然被掐断了一样等到了设定的时间没有正常执行协程后续代码!非必现bug,若发生大概率在高频率使用协程时易触发。

LuaFramework或xLua uLua都自带有协程coroutine,而且基本都使用对象池缓存协程对象,当我们稍微不小心就会引起对象池的问题,也就是持有一个已入池的对象。

1、所有持有写法必须要在使用完协程时手动置空持有对象。

self.co = coroutine.start(function()
        coroutine.waitxxx
        self.co = nil
        ... ...
end)

2、究极神坑!究极神坑!究极神坑!重要的事情说三遍!
当你想持有协程对象时,一定要保证协程执行过至少1次延迟(无论是延迟1帧还是多少秒)例如下面出问题的代码:

local cnt = param --外部传入param参数
local co
co = coroutine.start(function()
        for i = 1, cnt do
                coroutine.waitxxx
                ... ...
        end
​​​​​​​        ... ...
        table.removebyvalue(coTable, co)
end)
table.insert(coTable, co)

不要在意细节,param一定是整数,但可能为0,问题就出在cnt被赋予了一个0,导致for循环没有执行过1次,从而导致协程没有进行过1次延迟waitxxx,所以协程函数体会立即执行完成,关键点是table.removebyvalue(coTable, co)先于table.insert(coTable, co)执行,而table.insert(coTable, co)后执行就加入了1个已回收入对象池的对象。(持有已入池对象行为)后面发生什么就是你会发现有些协程好像无法正常执行完成,明明上一个还在正常输出,下一个就突然消失了,也就是存在这种持有已入池对象行为,要把这种行为全部抹除才能恢复正常,或者直接干脆不用对象池了,可能性能开销会上升点,不然就得排查全部相关的持有代码,将上面代码加一行延迟1帧或延迟渲染结束就能解决问题(保证至少执行过1次延迟!)

local cnt = param --外部传入param参数
local co
co = coroutine.start(function()
        coroutine.waitforendofframe()--延迟渲染结束帧
        for i = 1, cnt do
                coroutine.waitxxx
                ... ...
        end
​​​​​​​        ... ...
        table.removebyvalue(coTable, co)
end)
table.insert(coTable, co)

我试过在remove后直接将co=nil,insert时检查co~=nil再进行,还是会有异常情况。
如果Lua协程本身是没有对象池缓存机制的,那就不会存在我说的问题。

实际上这个问题就是对象池的坑,只是演变到了协程这里让人很抓狂 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/881983.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

某建筑市场爬虫数据采集逆向分析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 目标网站 aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55P2NvbXBsZXhuYW1lPSVFNiVCMCVCNA 提示:以下是本篇文章正文内容,下面…

十八,Spring Boot 整合 MyBatis-Plus 的详细配置

十八,Spring Boot 整合 MyBatis-Plus 的详细配置 文章目录 十八,Spring Boot 整合 MyBatis-Plus 的详细配置1. MyBatis-Plus 的基本介绍2. Spring Boot 整合 MyBatis Plus 的详细配置3. Spring Boot 整合 MyBatis plus 注意事项和细节4. MyBatisx 插件的…

空栈压数 - 华为OD统一考试(E卷)

2024华为OD机试(E卷D卷C卷)最新题库【超值优惠】Java/Python/C合集 题目描述 向一个空栈压入正整数,每当压入一个整数时,执行以下规则(设:栈顶至栈底整数依次编号为 $n_1, n_2, \dots, n_x $,其…

SPI驱动学习六(SPI_Master驱动程序)

目录 前言一、SPI_Master驱动程序框架1. SPI传输概述1.1 数据组织方式1.2 SPI控制器数据结构 2. SPI传输函数的两种方法2.1 老方法2.2 新方法 二、如何编写SPI_Master驱动程序1. 编写设备树2. 编写驱动程序 三、SPI_Master驱动程序简单示例demo1. 使用老方法编写的SPI Master驱…

NLP 主流应用方向

主流应用 文本分类文本匹配序列标注生成式任务 应用细分 常见落地应用举例: 文本纠错句法分析文本翻译话者分离 本质为文本分类任务数字归一化 实现数字映射,提高内容可读性 如将一九九九转1999

【高分系列卫星简介——高分三号卫星(GF-3)】

高分三号卫星(GF-3) 高分三号(GF-3)是我国首颗高分辨率、C频段、多极化合成孔径雷达(SAR)卫星,由中国空间技术研究院北京空间飞行器总部设计部研制,并于2016年8月10日成功发射。该卫…

flash_attention简要笔记

优化效果 原来,attention部分的计算量和中间激活占用显存的复杂度都是 O ( N 2 ) O(N^2) O(N2) 计算量部分原来QK矩阵乘和attn_scoreV矩阵乘的计算量,复杂度都是 O ( N 2 ) O(N^2) O(N2);中间激活因为中间有一个attn_score,所以复…

10.解析解方法推导线性回归——不容小觑的线性回归算法

引言 线性回归是许多复杂机器学习模型的基础。作为一种基本的机器学习方法,线性回归提供了清晰的思路和工具,通过理解其推导过程,可以更好地掌握机器学习的基本原理和模型设计。 通过阅读本篇博客,你可以: 1.学会如…

win11永久关闭Windows Defend

# Win11 Microsoft Defender 防病毒 彻底关闭 Win11 Microsoft Defender 防病毒关闭 **WinR****——输入 gpedit.msc ,打开本地组策略编辑器——计算机配置——管理模板——Windows组件——Microsoft Defender 防病毒——关闭 Microsoft Defender 防病毒策略——设置…

免费在线压缩pdf 压缩pdf在线免费 推荐简单好用

压缩pdf在线免费?在日常生活和工作学习中,处理PDF文件是常见任务。但有时PDF文件体积较大,给传输、存储和分享带来不便。因此,学习PDF文件压缩技巧十分必要。压缩PDF文件是指通过技术手段减小文件占用的存储空间,同时尽…

kafka 一步步探究消费者组与分区分配策略

本期主要聊聊kafka消费者组与分区 消费者组 & 消费者 每个消费者都需要归属每个消费者组,每个分区只能被消费者组中一个消费者消费 上面这段话还不够直观,我们举个例子来说明。 订单系统 订单消息通过 order_topic 发送,该topic 有 5个分区 结算系…

基于YOLO算法的网球运动实时分析-击球速度测量-击球次数(附源码)

这个项目通过分析视频中的网球运动员来测量他们的速度、击球速度以及击球次数。该项目使用YOLO(You Only Look Once)算法来检测球员和网球,并利用卷积神经网络(CNNs)来提取球场的关键点。此实战项目非常适合提升您的机…

基于 Web 的工业设备监测系统:非功能性需求与标准化数据访问机制的架构设计

目录 案例 【说明】 【问题 1】(6 分) 【问题 2】(14 分) 【问题 3】(5 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于 Web 系统架构设计的叙述,回答问题 1 至问题 3 。 【说明】 某公司拟开发一款基于 Web 的…

【JavaEE】多线程编程引入——认识Thread类

阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能帮到你! 目录 引入: 一:Thread类 1:Thread类可以直接调用 2:run方法 &a…

springboot每次都需要重设密码?明明在springboot的配置中设置了密码

第一步:查看当前的密码是什么? 打开redis-cli.exe,输入config get requirepass,查看当前的密码是什么? 接着,修改redis的配置文件,找到redis的安装目录,找到相关的conf文件&#x…

FreeRTOS下UART的封装

FreeRTOS下UART的封装_哔哩哔哩_bilibili Git使用的一个BUG: 当出现这个问题是因为git本身的安全证书路径有问题,我们需要重新指定路径 P1:UART程序层次

【2024】前端学习笔记7-颜色-位置-字体设置

学习笔记 1.定义:css2.颜色:color3.字体相关属性:font3.1.字体大小:font-size3.2.字体风格:font - style3.3.字体粗细:font - weight3.4.字体族:font - family 4.位置:text-align 1.…

K8s容器运行时,移除Dockershim后存在哪些疑惑?

K8s容器运行时,移除Dockershim后存在哪些疑惑? 大家好,我是秋意零。 K8s版本截止目前(24/09)已经发布到了1.31.x版本。早在K8s版本从1.24.x起(22/05),默认的容器运行时就不再是Doc…

最新Kali Linux超详细安装教程(附镜像包)

一、镜像下载: 链接:https://pan.baidu.com/s/1BfiyAMW6E1u9fhfyv8oH5Q 提取码:tft5 二、配置虚拟机 这里我们以最新的vm17.5为例。进行配置 1.创建新的虚拟机:选择自定义 2.下一步 3.选择稍后安装操作系统 4.选择Debian版本 因…

02_RabbitMQ消息丢失解决方案及死信队列

一、数据丢失 第一种:生产者弄丢了数据。生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题,都有可能。 第二种:RabbitMQ 弄丢了数据。MQ还没有持久化自己挂了。 第三种:消费端…