A c++ Godot engine module which makes it easy to run methods in threads.
Go to file
Relintai 7832681ba7 Updated the readme. 2023-01-09 21:15:56 +01:00
doc_classes Re-extracted class docs. 2022-01-12 22:23:22 +01:00
.gitignore Initial commit. 2020-05-24 10:42:29 +02:00
LICENSE Updated the copyright headers. 2022-01-12 22:23:30 +01:00
README.md Updated the readme. 2023-01-09 21:15:56 +01:00
SCsub Separated the job into ThreadPoolJob and ThreadPoolExecuteJob. This design makes everything more resilient to crashes, as it encourages writing encapsulated standalone job classes. The execute job can still be used to just run methods/functions in separate threads. 2020-05-30 16:20:53 +02:00
config.py Removed the copyright header from config.py, as utf-8 characters apparently can cause issues. 2020-08-08 20:03:49 +02:00
register_types.cpp Updated register_types.h and cpp to the current godot 4 style. 2023-01-08 15:55:39 +01:00
register_types.h Updated register_types.h and cpp to the current godot 4 style. 2023-01-08 15:55:39 +01:00
thread_pool.cpp Handle properly when use_threads is switched from false to true. Also make sure to check whether the update signal is connected or not before trying to set it up. 2022-09-18 10:40:06 +02:00
thread_pool.h Handle properly when use_threads is switched from false to true. Also make sure to check whether the update signal is connected or not before trying to set it up. 2022-09-18 10:40:06 +02:00
thread_pool_execute_job.cpp Work on fixing compile. 2023-01-09 14:10:42 +01:00
thread_pool_execute_job.h Work on fixing compile. 2023-01-09 14:10:42 +01:00
thread_pool_job.cpp Work on fixing compile. 2023-01-09 14:10:42 +01:00
thread_pool_job.h More work on fixing the compile for 4.0. 2022-02-08 11:51:46 +01:00

README.md

Thread pool module

A c++ Godot engine module, that will help you with threading.

It can also work if threads are not available (like on the javascript backend), in this case it runs jobs on the main thread. Jobs themselves can also distribute their work onto multiple frames, and you can set how much time is allocated per frame.

You can access it's setting from the Project->Project Settings... menu, in the ThreadPool category.

Godot Version Support

This branch tries to follow godot's master branch (as much as I have time).

For different godot versions look at the other branches.

Status for this branch: Update for 4.0 is work in progress.

ThreadPoolJob

Contains a job that can run on different threads.

A job is only considered finished, if you set the 'complete' property to 'true'. If multiple threads are available, the system will not check for this though, because there is no need.

If you want to support envioronments that doesn't have threading, you can use:

bool should_do(const bool just_check = false);
bool should_return();

For example:

func _execute():
    # On the first run this will return true, on subsequest runs it will return false
    if should_do():
        thing1()

    # if you ran out the allocated timeframe in a frame, this will return true
    if should_return():
        return

    if should_do():
        thing2()

    if should_return():
        return

    thing3()

    complete = true

should_do's optional parameter will let you just query the system, whether you finished a step, without incrementing internal couters. This is useful for example to distribute algorithms onto multiple frames.

For example:

func _execute():
    if should_do(true):
        while current <= elements.size():
            #do heavy calculations

            current += 1

            if should_return():
                return

        #The heavy calculation finished, increment counters
        should_do()
    
    if should_return():
        return

    if should_do():
        thing2()

    if should_return():
        return

    thing3()

    complete = true

This class will need litle tweaks, hopefully I can get to is soon.

ThreadPoolExecuteJob

This will let you run a method uin an another thread, without creating your own jobs.

Use it through the ThreadPool Singleton. Like:

ThreadPool.create_execute_job(self, "method", arg1, arg2, ...)

#or
ThreadPool.create_execute_job_simple(self, "method")

This class will need litle tweaks, hopefully I can get to is soon.

ThreadPool singleton

The ThreadPool singleton handles jobs.

If you have a job, submit it using add_job:

MyJob job = MyJob.new()
ThreadPool.add_job(job)

It's api is still a bit messy, it will be cleaned up (hopefully very soon).

Building

  1. Get the source code for the engine.

If you want Godot 3.2: git clone -b 3.2 https://github.com/godotengine/godot.git godot

If you want Godot 4.0: git clone https://github.com/godotengine/godot.git godot

last tested commit

  1. Go into Godot's modules directory.
cd ./godot/modules/
  1. Clone this repository
git clone https://github.com/Relintai/thread_pool thread_pool
  1. Build Godot. Tutorial