Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use of threading.Thread.join()

I am new to multithreading in python and trying to learn multithreading using threading module. I have made a very simple program of multi threading and i am having trouble understanding the threading.Thread.join method.

Here is the source code of the program I have made

import threading  val = 0  def increment():    global val     print "Inside increment"    for x in range(100):        val += 1    print "val is now {} ".format(val)  thread1 = threading.Thread(target=increment, args=()) thread2 = threading.Thread(target=increment, args=()) thread1.start() #thread1.join() thread2.start() #thread2.join()  

What difference does it make if I use

thread1.join() thread2.join() 

which I have commented in the above code? I ran both the source codes (one with comments and the one without comments) but the output is the same.

like image 890
Pratik Singhal Avatar asked Oct 02 '13 13:10

Pratik Singhal


People also ask

What is the use of join () in Python threading?

A thread can be joined in Python by calling the Thread. join() method. This has the effect of blocking the current thread until the target thread that has been joined has terminated.

What is use of join () in threads of Java?

Join method in Java allows one thread to wait until another thread completes its execution. In simpler words, it means it waits for the other thread to die. It has a void type and throws InterruptedException.

Is thread join necessary?

No join or System. exit necessary. Each thread lives its own life. As long as at least one thread is running, the program keeps running.


2 Answers

A call to thread1.join() blocks the thread in which you're making the call, until thread1 is finished. It's like wait_until_finished(thread1).

For example:

import time  def printer():     for _ in range(3):         time.sleep(1.0)         print "hello"  thread = Thread(target=printer) thread.start() thread.join() print "goodbye" 

prints

hello hello hello goodbye 

—without the .join() call, goodbye would come first and then 3 * hello.

Also, note that threads in Python do not provide any additional performance (in terms of CPU processing power) because of a thing called the Global Interpreter Lock, so while they are useful for spawning off potentially blocking (e.g. IO, network) and time consuming tasks (e.g. number crunching) to keep the main thread free for other tasks, they do not allow you to leverage multiple cores or CPUs; for that, look at multiprocessing which uses subprocesses but exposes an API equivalent to that of threading.

PLUG: ...and it is also for the above reason that, if you're interested in concurrency, you might also want to look into a fine library called Gevent, which essentially just makes threading much easier to use, much faster (when you have many concurrent activities) and less prone to concurrency related bugs, while allowing you to keep coding the same way as with "real" threads. Also Twisted, Eventlet, Tornado and many others, are either equivalent or comparable. Furthermore, in any case, I'd strongly suggest reading these classics:

  • Generator Tricks for Systems Programmers
  • A Curious Course on Coroutines and Concurrency
like image 89
Erik Kaplun Avatar answered Sep 21 '22 22:09

Erik Kaplun


I modified the code so that you will understand how exactly join works. so run this code with comments and without comments and observe the output for both.

val = 0  def increment(msg,sleep_time):    global val     print "Inside increment"    for x in range(10):        val += 1        print "%s : %d\n" % (msg,val)        time.sleep(sleep_time)  thread1 = threading.Thread(target=increment, args=("thread_01",0.5)) thread2 = threading.Thread(target=increment, args=("thread_02",1)) thread1.start() #thread1.join() thread2.start() #thread2.join() 
like image 38
aaj Avatar answered Sep 22 '22 22:09

aaj