【问题标题】:An async interpreter for Lua to solve a multithreaded approach?Lua 的异步解释器来解决多线程方法?
【发布时间】:2013-12-03 05:09:06
【问题描述】:

我的总体想法是,单线程应用程序(Lua 解释器)总是会降低依赖它的多线程应用程序(通用 C++ 应用程序)的性能。

为了规避这个问题,我正在考虑在解释器上采用异步方法,同时保持 C++ 应用程序多线程,这基本上意味着基于我的方法,Lua 解释器应该以某种方式将整个脚本/文件推送到调度程序中一种异步方法(无需等待结果),这取决于精心设计的 C++ 多线程消息传递系统来保持一切顺序。

通常的关系是C/C++ function <-> Lua(采用顺序方法);我想要C++ messaging system <-> entire Lua script 之类的东西。

我也对任何可以解决这个问题的方法持开放态度,并真正帮助 Lua 和专为多线程设计的 C++ 应用程序之间的混合。

这种方法是否可以通过某些软件实现?

编辑

我需要一些“用户证明”,我需要在 C++/Lua API 设计中实现这种行为。

【问题讨论】:

  • 谁在推动编排:C++ 还是 LUA?如果 C++ 调用 LUA,你不能使用许多解释器实例吗?如果 LUA 调用 C++,您可以为某些方法生成一个线程并立即返回。如果您不需要同步,则可以将其简化为 LUA 的简单即发即弃。
  • @Pragmateek 我应该为我的 C++ 多线程应用程序提供 Lua 作为脚本解决方案,因此“流程”的关键部分是从 Lua 到 C++。 “一劳永逸”听起来很像std::async 在 C++11 下的工作方式,这对我来说很有趣,你能详细介绍一下如何在 Lua 中做到这一点以及机制是什么?

标签: c++ c multithreading asynchronous lua


【解决方案1】:

一种选择是将与 lua 的通信实现为协程。消息通过 coroutine.yield(messagedata) 发送到 C++,然后通过 lua_resume 发回结果。 (另见:lua_newthread)。您甚至可以包装您的函数以提供更好的事件 UI。

function doThing(thing, other, data)
  return coroutine.yield("doThing", thing, other, data)
end

在任何给定时间,您仍然只能有一个线程运行 lua 解释器(您必须进行锁定),但您可以同时运行多个这样的协程。

【讨论】:

  • 不,我需要一些“用户证明”,这意味着我应该在 API 设计中实现这个机制。无论如何,谢谢你,但我知道这根本行不通。
【解决方案2】:

Lua 中的并发是一个有很多解决方案的主题。这是一个资源:

您实际上可以让自己变得简单,因为您实际上不必多线程运行 Lua 本身,这会带来许多额外的问题。

显而易见的解决方案是在单独的线程中运行 Lua,但只为 Lua 提供一个精简 API,其中每个 API 调用都会立即派生一个新线程/进程或使用某种消息传递来进行异步数据传输,甚至使用用于读取/写入某些值的短时信号量。此解决方案需要某种空闲循环或事件侦听器,除非您想忙着等待...

我认为使用新 API 仍然很容易实现的另一个选项实际上是 node.js 的方法:

  • 在单独的线程中运行 Lua
  • 让您的整个 API 函数只接受回调。这些回调是排队的,可以由您的 C++ 应用程序安排。
  • 您甚至可以但不必为标准 Lua API 提供回调包装器。

例子:

local version;
Application.requestVersionNumber(function(val) version = val; end)

当然,这个例子微不足道,但你明白了。

您应该知道的一件事是,如果您不小心,使用回调方法,脚本很快就会变得高度分层。虽然这对性能来说还不错,但它们可能难以阅读。

【讨论】:

  • 事实上我对“多线程”Lua 不感兴趣,这只会给用户带来问题,并有更多的错误空间。你能提供一些 C++ 回调的例子吗?
  • @user2485710 回调是 Lua 而不是 C++。我宁愿不添加 C 部分的示例,因为有很多事情需要考虑,这不仅仅是“举一个简短的例子”,因为一件事会遇到另一件事,否则它会被抽象得可能不会帮不了你。问一些具体的问题,我看看能不能回答。
  • 好的,但是我可以影响 Lua 解释器的整体行为吗?我的意思是我现在想到的解决方案是:默认情况下使所有 Lua 函数异步,Lua 只是一个脚本层,不执行计算,只是触发函数而不等待结果,所以 Lua 用户不需要做任何事情对他来说都是透明的;毕竟 Lua 用户想要(在我的情况下)是一种功能性方法,他甚至不关心它是如何实现的。
  • @user2485710 我不确定你为什么要改变解释器的行为(但你可以,Lua 是开源的)。 Lua 最终能做多少取决于您的应用程序、API 大小以及 API 函数对编写 Lua 脚本的用户的有用性,而不取决于它是否是异步的。
猜你喜欢
  • 2015-10-22
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 2019-05-17
  • 2018-07-31
  • 2012-10-07
  • 1970-01-01
相关资源
最近更新 更多