To those looking to 'quickfix' solution for limiting number of threads in 'threading' module in python3
- the basic logic is to wrap the main function into a wrapper and call on a wrapper containing the stop/go logic.
This below reuses solution proposed by Andpei, however the verbatim code from his post did not work, my modification which worked for me is below.
Python3:
import threading
import time
maxthreads = 3
smphr = threading.Semaphore(value=maxthreads)
threads = list()
SomeInputCollection=("SomeInput1","SomeInput2","SomeInput3","SomeInput4","SomeInput5","SomeInput6")
def yourmainfunction(SomeInput):
#main function
print ("Your input was: "+ SomeInput)
def task(SomeInput):
#yourmainfunction wrapped in a task
print(threading.currentThread().getName(), 'Starting')
smphr.acquire()
yourmainfunction(SomeInput)
time.sleep(2)
print(threading.currentThread().getName(), 'Exiting')
smphr.release()
def main():
threads = [threading.Thread(name="worker/task", target=task, args=(SomeInput,)) for SomeInput in SomeInputCollection]
for thread in threads:
thread.start()
for thread in threads:
thread.join()
if __name__== "__main__":
main()
Output:
worker/task Starting
Your input was: SomeInput1
worker/task Starting
Your input was: SomeInput2
worker/task Starting
Your input was: SomeInput3
worker/task Starting
worker/task Starting
worker/task Starting
worker/task Exiting
Your input was: SomeInput4
worker/task Exiting
worker/task Exiting
Your input was: SomeInput6
Your input was: SomeInput5
worker/task Exiting
worker/task Exiting
worker/task Exiting