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.