Logging 如何识别Lua脚本正在哪个线程上运行?
我目前正在开发Lua脚本,以便与一些第三方产品集成。这个第三方产品同时在多个线程上调用我的Lua脚本,这很好。但是,当我从脚本写入日志文件时,我想确定哪个线程正在运行我的Lua脚本,并将其写入日志文件 这将允许我确定哪些日志条目属于同一个条目 任何关于如何正确区分Lua中不同线程的日志条目的想法都是非常受欢迎的。表的默认表示形式包含表的(内存)地址。它保证在同一进程上运行的不同Lua VM之间是唯一的 您可以利用此漏洞为每个线程生成唯一的ID:Logging 如何识别Lua脚本正在哪个线程上运行?,logging,lua,Logging,Lua,我目前正在开发Lua脚本,以便与一些第三方产品集成。这个第三方产品同时在多个线程上调用我的Lua脚本,这很好。但是,当我从脚本写入日志文件时,我想确定哪个线程正在运行我的Lua脚本,并将其写入日志文件 这将允许我确定哪些日志条目属于同一个条目 任何关于如何正确区分Lua中不同线程的日志条目的想法都是非常受欢迎的。表的默认表示形式包含表的(内存)地址。它保证在同一进程上运行的不同Lua VM之间是唯一的 您可以利用此漏洞为每个线程生成唯一的ID: localunique_id=tostring({
localunique_id=tostring({}):sub(8)——提取“地址”部分
打印(唯一标识)
-->输出0x7f876b608b00
作为旁注,这是一种推荐的生成用于全局Lua的唯一键的方法 你说的是lua协程还是需要底层操作系统支持的实际抢占线程?@greatwolf:我更喜欢使用调用我的lua的C代码中创建的线程的线程id。但是,如果这会造成问题或使问题变得复杂,我会选择任何其他机制来区分日志中的线程。唯一的方法是从Lua访问底层OS api。在windows中,这将是
GetCurrentThread
或GetCurrentThreadId
。如果FFI可用,您可以使用它直接从lua绑定到这些函数。否则,您可能需要使用Lua C扩展模块公开这些函数。@greatwolf,或者您可以在另一个线程上启动新的Lua VM时传递并存储一些标识id。就像每个luavm在它的注册表上都有一个线程标识ID或者类似的东西。或者您可以将lua_状态包装到另一个结构中,该结构将保存您生成的线程ID。此代码导致异常:错误的参数#2到'sub'(预期为数字,没有值)。我已将代码更改为:local unique_ID=tostring({}),并将其用作string.sub(unique_ID,8)