python multithreading wait till all threads finished python multithreading wait till all threads finished multithreading multithreading

python multithreading wait till all threads finished


Put the threads in a list and then use the Join method

 threads = [] t = Thread(...) threads.append(t) ...repeat as often as necessary... # Start all threads for x in threads:     x.start() # Wait for all of them to finish for x in threads:     x.join()


You need to use join method of Thread object in the end of the script.

t1 = Thread(target=call_script, args=(scriptA + argumentsA))t2 = Thread(target=call_script, args=(scriptA + argumentsB))t3 = Thread(target=call_script, args=(scriptA + argumentsC))t1.start()t2.start()t3.start()t1.join()t2.join()t3.join()

Thus the main thread will wait till t1, t2 and t3 finish execution.


In Python3, since Python 3.2 there is a new approach to reach the same result, that I personally prefer to the traditional thread creation/start/join, package concurrent.futures: https://docs.python.org/3/library/concurrent.futures.html

Using a ThreadPoolExecutor the code would be:

from concurrent.futures.thread import ThreadPoolExecutorimport timedef call_script(ordinal, arg):    print('Thread', ordinal, 'argument:', arg)    time.sleep(2)    print('Thread', ordinal, 'Finished')args = ['argumentsA', 'argumentsB', 'argumentsC']with ThreadPoolExecutor(max_workers=2) as executor:    ordinal = 1    for arg in args:        executor.submit(call_script, ordinal, arg)        ordinal += 1print('All tasks has been finished')

The output of the previous code is something like:

Thread 1 argument: argumentsAThread 2 argument: argumentsBThread 1 FinishedThread 2 FinishedThread 3 argument: argumentsCThread 3 FinishedAll tasks has been finished

One of the advantages is that you can control the throughput setting the max concurrent workers.