Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Communicate data between threads in python

I am new to python I have very little knowledge about threads in python. Here is my sample code.

import threading
from threading import Thread
import time

check = False

def func1():
    print ("funn1 started")
    while check:
        print ("got permission")

def func2():
    global check
    print ("func2 started")
    time.sleep(2)
    check = True
    time.sleep(2)
    check = False

if __name__ == '__main__':
    Thread(target = func1).start()
    Thread(target = func2).start()

What I want is to see see "got permission" as the output. But with my current code it is not happening. I assume that the func1 thread is closed before func2 changes the check value to True.

How can I keep func1 alive? I have researched on the internet but I could not found a solution. Any help would be appreciated. Thank you in advance!

like image 655
iuhettiarachchi Avatar asked Jul 09 '18 09:07

iuhettiarachchi


1 Answers

The problem here is that func1 performs the check in the while loop, finds it is false, and terminates. So the first thread finishes without printing "got permission".

I don't think this mechanism is quite what you are looking for. I would opt to use a Condition like this,

import threading
from threading import Thread
import time

check = threading.Condition()

def func1():
    print ("funn1 started")
    check.acquire()
    check.wait()
    print ("got permission")
    print ("funn1 finished")


def func2():
    print ("func2 started")
    check.acquire()
    time.sleep(2)
    check.notify()
    check.release()
    time.sleep(2)
    print ("func2 finished")

if __name__ == '__main__':
    Thread(target = func1).start()
    Thread(target = func2).start()

Here the condition variable is using a mutex internally to communicate between the threads; So only one thread can acquire the condition variable at a time. The first function acquires the condition variable and then releases it but registers that it is going to wait until it receives a notification via the condition variable. The second thread can then acquire the condition variable and, when it has done what it needs to do, it notifies the waiting thread that it can continue.

like image 197
jdowner Avatar answered Sep 30 '22 08:09

jdowner