• Advertisement
Sign in to follow this  

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

This topic is 1443 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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.

Share this post


Link to post
Share on other sites
Advertisement

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

Edited by CableGuy

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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!

Share this post


Link to post
Share on other sites
 

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.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement