Skip to content

Latest commit

 

History

History
133 lines (104 loc) · 4.86 KB

README.md

File metadata and controls

133 lines (104 loc) · 4.86 KB

Python API

Quickstart

Installing the save_thread_result module:

pip3 install -U save-thread-result     # MacOS/Linux
pip  install -U save-thread-result     # Windows

# if that doesn't work:
python3 -m pip install -U save-thread-result     # MacOS/Linux
python  -m pip install -U save-thread-result     # Windows

Using the ThreadWithResult class from the save_thread_result module:

from save_thread_result import ThreadWithResult


# As of Release 0.0.3, you can also specify values for
# `group`, `name`, and `daemon` if you want to set those
# values manually.

thread = ThreadWithResult(
    target = my_function,
    args   = (my_function_arg1, my_function_arg2, ...)
    kwargs = {my_function_kwarg1: kwarg1_value, my_function_kwarg2: kwarg2_value, ...}
)

thread.start()
thread.join()
if getattr(thread, 'result', None):
    print(thread.result)
else:
    # thread.result attribute not set - something caused
    # the thread to terminate BEFORE the thread finished
    # executing the function passed in through the
    # `target` argument
    print('ERROR! Something went wrong while executing this thread, and the function you passed in did NOT complete!!')

Reading the documentation for more information:

from save_thread_result import ThreadWithResult
help(ThreadWithResult)

Short explanation

This module uses a threading.Thread subclass ThreadWithResult that saves the result of a thread (from threading built-in module in the Python Standard library) as its result attribute - i.e. after the thread finishes running, call thread.result to get the return value from the function that ran on that thread.

Examples

Dummy example (compatible with releases after python3.6):

from save_thread_result import ThreadWithResult

import time, random, threading


def function_to_thread(n):
    count = 0
    while count < 3:
            print(f'Still running {threading.current_thread().name}...')
            count +=1
            time.sleep(3)
    result = random.random()
    print(f'Return value of {threading.current_thread().name} should be: {result}')
    return result


def main():
    thread1 = ThreadWithResult(target=function_to_thread, args=(1,))
    thread2 = ThreadWithResult(target=function_to_thread, args=(2,))
    thread1.start()
    thread2.start()
    thread1.join()
    thread2.join()
    print(f'The `result` attribute of {thread1.name} is: {thread1.result}')
    print(f'The `result` attribute of {thread2.name} is: {thread2.result}')

main()
dummy example compatible with releases before python3.6
from save_thread_result import ThreadWithResult

import time, random, threading

def function_to_thread(n):
    count = 0
    while count < 3:
        print('Still running ' + threading.current_thread().name + '...')
        count += 1
        time.sleep(3)
    result = random.random()
    print('Return value of ' + threading.current_thread().name + ' should be: ' + str(result))
    return result

def main():
    thread1 = ThreadWithResult(target=function_to_thread, args=(1,))
    thread2 = ThreadWithResult(target=function_to_thread, args=(2,))
    thread1.start()
    thread2.start()
    thread1.join()
    thread2.join()
    print('The `result` attribute of ' + thread1.name +  ' is: ' + str(thread1.result))
    print('The `result` attribute of ' + thread2.name +  ' is: ' + str(thread2.result))

main()
More information
Sources I looked at before creating the custom class