Multi threading in Python - Parallelization



  • Hi all.
    I have read some very old posts about multi threading in python, and I can't understand squat.
    Would it be possible for someone to post a simple example on how to write a script that is multithreaded and does the following:

    1. Get the number of Virtual cores in my system "x" (I have a 12 core Mac pro with 24 threads)
    2. make a List with 100 numbers [1,2,3,4.... 100]
    3. Divide that list into "x" segments
    4. Send each of the segments to each of my cores (threads)
    5. Each thread multiplies each item of the segment by 2 (just to do something)
    6. When all threads are done, assemble a new list with the result of all segments in the correct order.

    Is that even possible?
    Thanks


  • Global Moderator

    Hello an welcome to the PluginCafe.

    Please always add tags to your posts to help the community to organize the forum's content. You can also mark your post as a question using the Q&A system. See Read Before Posting.

    I assume you are using Cinema 4D R20?

    Notice that a script is - well - a script. A script is started, executes some command and then finishes. While doing so, Cinema 4D will be blocked. You can use threads to distribute the work done in the script but the script will keep blocking Cinema while doing so.

    You find all components related to threading in the c4d.threading module.

    The number of threads that should be used can be obtained with GeGetCurrentThreadCount().

    A custom thread is based on C4DThread. Such a custom thread can receive, process and return data. Data can be stored as member variables and accessed using custom functions. The Main() function of the thread contains the code that is executed when the thread is running.

    from c4d import threading
    
    class MyThread(c4d.threading.C4DThread):
    
        # input data
        data = []
        # output data
        results = []
    
        # set data
        def SetData(self, arguments):
            self.data = arguments
            
        # process data
        def Main(self):
            
            # multiply each item with 2 and store results
            for item in self.data:
                item = item * 2
                self.results.append(item)
                      
        # return results
        def GetResults(self):
            return self.results
    

    A new thread is created by creating an instance of the thread class. A thread is started using Start(). You can wait for the thread to finish using Wait().

    # create thread
    thread = MyThread()   
    
    # prepare input data
    data = []
    data.append(1)
    data.append(2)
    data.append(3)
    
    # set input data
    thread.SetData(data)
    
    # start thread and wait
    thread.Start()
    thread.Wait(False)
    
    # get results
    results = thread.GetResults()
    

    If you want to run multiple thread, you have to start these threads an then wait in a loop for all threads to finish (IsRunning()).

    Creating a list with items and splitting that into segments is just basic programming.

    best wishes,
    Sebastian



  • I have a script that takes 5 hours to do something :-)
    I wouldn't mind it taking 5 hours / 12

    Thank you for the information. I'll put it to good use... and let you know when I fail!