Advertisement

[Lua] Seeking advice for multiple OS Threads, handling lua_State

Started by February 07, 2014 10:05 PM
3 comments, last by Zouflain 10 years, 9 months ago
I've hit a brick wall when it comes to an algorithm I'm working on. Data objects are distributed on a quad-tree, and each leaf node is batch processed by an OS thread from a threadpool. The actual processing happens in Lua, however, and that's where I run into serious problems. I understand that every OS Thread should have its own lua_State, but initialization of the Lua script is slow: it's a very large, very extensive script split between multiple files with plenty of C functions tied in - parsing and initializing all this again and again would be nightmarishly slow. Instead I'd rather initialize once, copy the read-made data into each thread's lua_State, and then run the processing. Unfortunately, Lua seems to define "thread" as something totally different than an OS thread, and functions like lua_newthread or lua_xmove are only intended for single-threaded applications. It also makes googling about this almost impossible: everything is about co-routines, which I can't see being helpful here. Any advice for moving forward would be greatly appreciated.

Can't you initialize your Lua states before hand and store them in an array, one for each thread?

Also you might want to look here, some of the libraries allow concurrent execution of Lua code

Advertisement

I've hit a brick wall when it comes to an algorithm I'm working on. Data objects are distributed on a quad-tree, and each leaf node is batch processed by an OS thread from a threadpool. The actual processing happens in Lua, however, and that's where I run into serious problems. I understand that every OS Thread should have its own lua_State, but initialization of the Lua script is slow: it's a very large, very extensive script split between multiple files with plenty of C functions tied in - parsing and initializing all this again and again would be nightmarishly slow. Instead I'd rather initialize once, copy the read-made data into each thread's lua_State, and then run the processing. Unfortunately, Lua seems to define "thread" as something totally different than an OS thread, and functions like lua_newthread or lua_xmove are only intended for single-threaded applications. It also makes googling about this almost impossible: everything is about co-routines, which I can't see being helpful here. Any advice for moving forward would be greatly appreciated.

Why couldn't your threadpool initialize in parallel? Why would it take longer to initialize your whole thread pool than to initialize one thread? Are you only able to initialize one at a time?

There are some thread libraries which sit on top of Lua and give Lua a threading model complete with thread safety objects. That way a single Lua state can spawn off multiple threads and still share the same global Lua state. I've not used them too much, but I did do some research into this. See if any of these work for you ?

http://lua-users.org/wiki/MultiTasking

http://www.luteus.biz/Download/LoriotPro_Doc/LUA/LUA_For_Windows/lanes/comparison.html

I believe some of the threading models do "copy" the global state across multiple lua_state objects across threads just as you want, so it's worth looking through them.

Good Luck!

 

Can't you initialize your Lua states before hand and store them in an array, one for each thread?

 
You're absolutely right. I realized this on the way to work after posting. All persistant values (sans the function definitions) were stored in an SQL database, so there's no reason not to just pre-load the virtual machines with the LUA code.

Initializatio might be slow, but it only has to happen once (even though the threads might dynamically open and close, they can simply re-use the already-initialized lua states). Thanks for pointing this out.

This topic is closed to new replies.

Advertisement