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)
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.
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
- Return value from thread
- Threading in python: retrieve return value when using target= [duplicate]
- How to get the return value from a thread in python?
- Using Python Threading and Returning Multiple Results (Tutorial)
- How to get the return value from a thread using python
- How to manage python threads results?
- How to obtain the results from a pool of threads in python?
- Google search