如何使Lua中的print或write函数具有原子性?
2014-8-28 21:30:9
收藏:0
阅读:111
评论:2
我使用以下代码来同时使用多个核心向文件或标准输出写入:
f:write(x, "\t", y, "\n")
print(x, '\t', y, '\n')
如何使这些语句原子而不会竞争?
更新:似乎我的问题引起了混淆。因此,我会提出更具体的问题:如果我在不同的处理器上运行上述代码,但将输出导入相同的文件,如何确保来自不同处理器的输出符合预期地保留在不同行中?
点赞
用户3677376
如果使用 ..连接子串,那么将结果字符串一次性传递给OS的机率就会增加。
f:write( x .. "\t" .. y .. "\n" )
f:flush()
io.write( tostring( x ) .. "\t" .. tostring( y ) .. "\n" )
io.flush()
这对于像日志记录这样不太重要的任务来说可能已经足够了。如果不够好,您需要对输出操作进行序列化。一个可能的方法是文件锁定。流行的 luafilesystem 模块(可在所有主要桌面操作系统上使用)包括用于此目的的 lock 和 unlock 函数:
local lfs = require( "lfs" )
while not lfs.lock( f, "w" ) do end
f:write( x, "\t", y, "\n" )
f:flush()
lfs.unlock( f )
f:close()
不幸的是,您必须对锁执行繁忙等待。如果您能够在 luaposix 中使用 fcntl 函数(仅适用于类UNIX操作系统,如Linux或MacOS),则可以使调用进程阻塞,直到可以获取锁(参见此处 有一个示例,但使用 F_SETLKW 替换 F_SETLK)。 (对于 print 情况,我会在某个地方使用一个临时文件上的锁定-我还没有找到一个提供访问信号量或等效物的 Lua 模块。)
2014-08-30 03:38:11
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
Lua本身不支持真正的多线程。因此,在多核处理器中,不会出现类似竞争的问题。请注意,这意味着在您的代码中,
f:write和print不会同时执行。