Package: threadingbatch
Thread batch with timeout - return values in dictimport threadingbatchadd the decorator @threadingbatch.thread_capture to your functionadd *args, **kwargs to your functioncreate a list of lists with all function callscall threadingbatch.start_all_threadsget the results from threadingbatch.results$pipinstallthreadingbatchfromkthread_sleepimportsleep# killing might not work with time.sleep ( pip install kthread-sleep )importthreadingbatchimportrandom@threadingbatch.thread_capture# The threaded function must be decorateddeftest(testnumber,*args,**kwargs):# a threaded function must have *args, **kwargs and can't have the keyword argument _starttimeprint(f"start{testnumber}")sleep(1)v=random.randrange(1,30)print(f"end{testnumber}")returnvflist=[]forini,kinenumerate(range(20)):# creating 20 function callsflist.append([test,# function(),# args{"testnumber":ini},# kwargsf"function_{str(ini)}",# key in threadingbatch.results (must be unique and type str), the key can't have the name "done"])flistt=threadingbatch.start_all_threads(flist,threadtlimit=5,# number of simultaneously executed threadstimeout=4,# call Kthread.kill after n secondssleepafterkill=0.02,# sleep time after calling Kthread.killsleepafterstart=0.02,# sleep time after starting a threadignore_exceptions=False,verbose=False,)whilenotthreadingbatch.results["done"]:# when all threads are done, threadingbatch.results['done'] changes to Truepasssleep(0.1)# output:# start 0# start 1# start 2# start 3# start 4# start 5# end 0# start 6# end 1# start 7# end 2# start 8# end 3# ....print(threadingbatch.results)# defaultdict(<function threadingbatch.<lambda>()>,#             {'done': True,#              'function_19': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 11, 'realstart': 1673158006.740858}),#              'function_18': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 23, 'realstart': 1673158006.4810376}),#              'function_17': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 14, 'realstart': 1673158005.2808566}),#              'function_16': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 1, 'realstart': 1673158005.1208546}),#              'function_15': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 4, 'realstart': 1673158005.0807495}),#              'function_14': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 23, 'realstart': 1673158004.7609262}),#              'function_13': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 15, 'realstart': 1673158004.7207859}),#              'function_12': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 4, 'realstart': 1673158004.5210721}),#              'function_11': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 15, 'realstart': 1673158002.9808593}),#              'function_10': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 4, 'realstart': 1673158002.941067}),#              'function_9': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 20, 'realstart': 1673158002.9007895}),#              'function_8': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 29, 'realstart': 1673158002.420729}),#              'function_7': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 6, 'realstart': 1673158002.3609126}),#              'function_6': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 16, 'realstart': 1673158002.3207767}),#              'function_5': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 1, 'realstart': 1673158000.5775528}),#              'function_4': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 18, 'realstart': 1673158000.5409462}),#              'function_3': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 23, 'realstart': 1673158000.5010219}),#              'function_2': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 14, 'realstart': 1673158000.4609187}),#              'function_1': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 10, 'realstart': 1673158000.420832}),#              'function_0': defaultdict(<function threadingbatch.<lambda>()>,#                          {'results': 12, 'realstart': 1673158000.370694})})