码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Lua--协同线程与文件IO


    合集 - Redis(18)
    1.Redis--简介及配置文件详解04-242.Redis--常用命令(1)04-243.Redis-Hash型与List型操作命令04-274.Redis--Set、ZSet操作命令和benchmark测试工具04-285.Redis--SDS字符串与集合的底层实现原理04-296.Redis--发布订阅命令和Redis事务05-017.Redis-持久化之RDB05-058.Redis--持久化之AOF05-069.Redis--集群搭建与主从复制原理05-0710.Redis--哨兵机制与CAP定理05-0811.Redis--Redis分布式系统的原理与实操05-1112.Redis--Jedis应用与Spring Boot整合Redis05-1113.Redis--高并发问题:缓存穿透、缓存击穿、缓存雪崩与数据库缓存双写不一致05-1114.Lua--基础入门05-1215.Lua--table、模块、元表与元方法、面向对象05-12
    16.Lua--协同线程与文件IO05-13
    17.Redis--一文搞懂Redis分布式锁05-1318.redis--Redisson的八种锁机制05-13
    收起

    协同线程与协同函数

    协同线程

    Lua中有一种特殊的线程,称为coroutine,协同线程,简称协程。

    其可以在运行时暂停执行,然后转去执行其他线程,然后可以返回再继续执行没完成的内容。即可以“走走停停,停停走走”。

    任意时刻只会有一个协程执行,不会出现多个协程同时执行的情况。

    协同线程的类型为thread,其启动、暂停、重启等,通过函数来控制,具体方法如下:

    无标题

    -- 创建一个协同线程实例
    co = coroutine.create(function(a,b)
        print(a,b,a+b)
        -- 获取正在运行的协同线程实例
        local co = coroutine.running()
        -- 输出协同线程实例的状态
        print(coroutine.status(co))
        -- 将当前协同线程挂起
        coroutine.yield()
        print("协同线程恢复了")
    end)
    
    -- 启动协同线程
    coroutine.resume(co,1,2)
    -- 输出协同线程的状态
    print("主线程查看协同线程状态:"..coroutine.status(co))
    -- 恢复协同线程的运行,不传后面的参数了,因为协同线程已经挂起了
    coroutine.resume(co)
    -- 输出协同线程的状态
    print("主线程查看协同线程状态:"..coroutine.status(co))
    

    运行结果如下:

    无2标题

    协同函数

    协同线程可以单独创建执行,也可以通过协同函数调用启动执行。

    使用coroutine的wrap()函数创建的就是协同函数,类型为function。

    协同函数的调用会启动其内置的协同线程。

    -- 创建一个协同函数
    co = coroutine.wrap(function(a,b)
        print(a,b,a+b)
        local co = coroutine.running()
        print(coroutine.status(co))
        coroutine.yield()
        print("协同线程恢复了")
        print(a,b,a+b)
    end)
    
    -- 调用协同函数,启动协同线程    
    co(1,2)
    
    co()
    

    运行结果如下

    无标3题

    文件IO

    文件IO的函数分为两类:静态函数与实例 函数。

    静态函数:通过io.xxx()方式对文件进行操作。

    实例函数:通过面向对象的方式操作。

    常用静态函数

    • io.open() 以指定模式打开文件,返回文件对象。

      格式:io.open(filename,mode)

      模式mod有三种:

      • r:只读,默认模式
      • w:只写,会覆盖原内容
      • a:只写,追加写入
      • +:增加符,在r+ ,w+,a+均变为了读写
      • b:二进制符,如果文件为二进制文件。则需要变为rb、wb、ab
    • io.input() 指定要读取的文件

      格式:io.input(file)

    • io.output() 指定要写入的文件

      格式:io.output(file)

    • io.read() 以指定格式读取io.input(file)中的内容。

      格式:io.read(format)

      format 的格式有:

      • *l:从当前位置的下一个位置读取整行,默认格式
      • *n:读取下一个数字
      • *a:从当前位置的下一个位置读取整个文件
      • number:这是一个数字,表示要读取的的字符的个数
    • io.write(data) 将数据data写入到io.output()中指定的文件

    -- 以只读方法打开一个文件
    local file = io.open("test.txt","r")
    io.input(file)
    -- 读取文件内容并输出
    local content = io.read("*a")
    print(content)
    -- 关闭文件
    file:close()-- 以只读方法打开一个文件
    local file = io.open("test.txt","r")
    io.input(file)
    -- 读取文件内容并输出
    local content = io.read("*a")
    print(content)
    -- 关闭文件
    file:close()
    
    
    -- 以追加方法打开一个文件
    local file = io.open("test.txt","a")
    io.output(file)
    -- 向文件中写入内容
    io.write("这是追加的内容\n")
    -- 关闭文件
    file:close()
    

    常用实例函数

    • file:read() :这里的file是io.open() 返回的file,用法与io.read()相同

    • file:write():与io.write()相同

    • file:seek():获取或设置文件读写指针的位置。位置从1开始,除文件最后一行外,每行都有行结束符,其占两个字符位置。

      位置0 表示文件第一个位置。

      格式:file:seek(whence,offset)

      当seek()无参时,返回读写指针的位置。

      参数whence有三种,表示将指针定位到不同位置。

      参数offset 表示相对于whence 位置的偏移量,offset默认0,为正表示向后偏移,为负表示向前偏移。

    ​ whence的三种值:

    1. set:将指针定位到文件开头处,即0位置处
    2. cur:指针保持当前位置不变,默认
    3. end:将指针定位到文件结尾处

    -- 以只读方法打开一个文件
     file = io.open("test.txt","r")
    
    -- 读取文件内容并输出
    local content = file:read("*a")
    print(content)
    -- 关闭文件
    file:close()
    
    -- 以追加方法打开一个文件
     file = io.open("test.txt","a")
    -- 向文件中写入内容
    file:write("这是追加的内容\n")
    -- 关闭文件
    file:close()
    
    file = io.open("test.txt","r")
    pos= file:seek()
    print("当前文件指针位置:"..pos)
    -- 将文件指针移动到文件开头
    file:seek("set",0)
    pos= file:seek()
    print("当前文件指针位置:"..pos)
    -- 将文件指针移动到文件末尾
    file:seek("end",0)
    pos= file:seek()
    print("当前文件指针位置:"..pos)
    file:close()
    

    本文来自博客园,作者:NE_STOP,转载请注明原文链接:https://www.cnblogs.com/alineverstop/p/20029332

  • 相关阅读:
    Jenkins 自动打包发布 SpringCloud 微服务项目
    WorkPlus打造安全专属的移动数字化航空母舰,助力企业全面掌控业务和生态
    浮动IP、IP、动态IP、静态IP等各类IP之区别
    01. 课程简介
    【无标题】
    RabbitMQ之集群管理
    【随笔】移动端input type|语义与IOS按键
    基于微服务SDK框架与JavaAgent技术,低成本助力应用高效发布
    Day17-购物车页面-收获地址-初步封装my-address组件
    API接口获取商品订单详情返回值说明
  • 原文地址:https://www.cnblogs.com/alineverstop/p/20029332
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号