| lua_parallel {luajr} | R Documentation |
Run Lua code in parallel
Description
Runs a Lua function multiple times, with function runs divided among multiple threads.
Usage
lua_parallel(func, n, threads, pre = NA_character_)
Arguments
func |
Lua expression evaluating to a function. |
n |
Number of function executions. |
threads |
Number of threads to create, or a list of existing Lua states
(e.g. as created by |
pre |
Lua code block to run once for each thread at creation. |
Details
This function is experimental. Its interface and behaviour are likely to change in subsequent versions of luajr.
lua_parallel() works as follows. A number threads of new Lua states is
created with the standard Lua libraries and the luajr module opened in
each (i.e. as though the states were created using lua_open()). Then, a
thread is launched for each state. Within each thread, the code in pre is
run in the corresponding Lua state. Then, func(i) is called for each i
in 1:n, with the calls spread across the states. Finally, the Lua states
are closed and the results are returned in a list.
Instead of an integer, threads can be a list of Lua states, e.g. NULL
for the default Lua state or a state returned by lua_open(). This saves
the time needed to open the new states, which takes a few milliseconds.
Value
List of n values returned from the Lua function func.
Safety and performance
Note that func has to be thread-safe. All pure Lua code and built-in Lua
library functions are thread-safe, except for certain functions in the
built-in os and io libraries (search for "thread safe" in the
Lua 5.2 reference manual).
Additionally, use of luajr reference types is not thread-safe because
these use R to allocate and manage memory, and R is not thread-safe. This
means that you cannot safely use luajr.logical_r, luajr.integer_r,
luajr.numeric_r, luajr.character_r, or other reference types within
func. luajr.list and luajr.dataframe are fine, provided the list
entries / dataframe columns are value types.
There is overhead associated with creating new Lua states and with gathering all the function results in an R list. It is advisable to check whether running your Lua code in parallel actually gives a substantial speed increase.
Examples
lua_parallel("function(i) return i end", n = 4, threads = 2)