【问题标题】:How do I identify on which thread a Lua script is running?如何识别 Lua 脚本在哪个线程上运行?
【发布时间】:2014-06-07 21:38:16
【问题描述】:

我目前正在编写 Lua 脚本以与某些第三方产品集成。这个第三方产品同时在多个线程上调用我的 Lua 脚本,这很好。但是,当我从脚本写入日志文件时,我想确定哪个线程正在运行我的 Lua 脚本并将其写入日志文件。

这将允许我确定哪些日志条目属于一起。

非常欢迎任何关于如何正确区分 Lua 中不同线程的日志条目的想法。

【问题讨论】:

  • 你说的是需要底层操作系统支持的 lua 协程还是实际的抢占式线程?
  • @greatwolf:我更希望从调用我的 LUA 的 C 代码中创建的线程获得线程 ID。但是,如果这会造成问题或变得复杂,我会选择任何其他机制来区分日志中的线程。
  • 唯一的方法是从 Lua 访问底层 OS api。在 Windows 中,这将是 GetCurrentThreadGetCurrentThreadId。如果 FFI 可用,您可以使用它直接从 lua 绑定到这些函数。否则,您可能需要使用 Lua C 扩展模块公开这些函数。
  • @greatwolf ,或者您可以在另一个线程上启动新的 Lua VM 时传递并存储一些标识 ID。就像每个 Lua VM 在它的注册表或类似的东西上都有一个线程标识 ID。或者您可以将 lua_State 包装到另一个结构中,该结构将保存您生成的线程 ID。

标签: logging lua


【解决方案1】:

表的默认tostring() 表示包含表的(内存)地址。它保证在同一进程上运行的不同 Lua VM 中是唯一的。

您可以利用它为每个线程生成一个唯一 ID:

local unique_id = tostring( {} ):sub(8) -- extracts the "address" part

print(unique_id)
--> outputs 0x7f876b608b00

附带说明,这是生成唯一密钥的推荐方法,用于全局 Lua registry

【讨论】:

  • 此代码导致异常:错误参数 #2 到 'sub'(预期数字,没有值)
  • 我已将代码更改为:local unique_id = tostring( {} ) 并将其用作 string.sub(unique_id, 8)
猜你喜欢
  • 2010-10-25
  • 2016-06-19
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 2021-08-19
  • 2012-05-15
相关资源
最近更新 更多