1

I created two threads each running different functions. What i tryed to achieve is if first thread ends then the second should also end ( i tryed achieving it using global variable) Once both the threads end the same procedure should continue. The script is not working as expected.

I am using Linux - Centos and python 2.7

#!/usr/bin/python
import threading
import time
import subprocess
import datetime
import os
import thread
command= "strace -o /root/Desktop/a.txt -c ./server"
final_dir = "/root/Desktop/"
exitflag = 0
# Define a function for the thread
def print_time(*args):
 os.chdir(final_dir)
 print "IN first thread"
 proc = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 proc.wait(70)
 exitflag=1
def print_time1(*args):
 print "In second thread"
 global exitflag
 while exitflag:
 thread.exit()
 #proc = subprocess.Popen(command1,shell=True,stdout=subprocess.PIPE, sterr=subprocess.PIPE)
# Create two threads as follows
 while (1):
 t1=threading.Thread(target=print_time)
 t1.start()
 t2=threading.Thread(target=print_time1)
 t2=start()
 time.sleep(80)
 z = t1.isAlive()
 z1 = t2.isAlive()
 if z:
 z.exit()
 if z1:
 z1.exit()
 threading.Thread(target=print_time1).start()
 threading.Thread(target=print_time1).start()
 print "In try"

Where am i going wrong?

asked Jan 22, 2015 at 11:50

2 Answers 2

1

You could create an object to share state, and have the dependent thread check that state. Something like:

import threading
import time
import datetime
class Worker1( threading.Thread ):
 def __init__(self, state):
 super(Worker1, self).__init__()
 self.state = state 
 def run(self):
 print_time_helper("Worker1 Start")
 time.sleep(4)
 print_time_helper("Worker1 End")
 self.state.keepOnRunning = False
class Worker2( threading.Thread ):
 def __init__(self, state):
 super(Worker2, self).__init__()
 self.state = state 
 def run(self):
 while self.state.keepOnRunning:
 print_time_helper("Worker2")
 time.sleep(1)
class State( object ):
 def __init__(self):
 self.keepOnRunning = True 
def main():
 state = State()
 thread1 = Worker1(state)
 thread2 = Worker2(state)
 thread1.start()
 thread2.start()
 thread1.join()
 thread2.join()
def print_time_helper(name):
 print "{0}: {1}".format(name, datetime.datetime.now().time().strftime("%S"))

which will output something like this (numbers show current time seconds):

Worker1 Start: 39
Worker2: 39
Worker2: 40
Worker2: 41
Worker2: 42
Worker1 End: 43

However, this is a bit simplistic for most situations. You might be better off using message queues - this is a good intro.

answered Jan 22, 2015 at 13:07
Sign up to request clarification or add additional context in comments.

1 Comment

it directly gives me Worker1 End: 25
0

Use a threading.Event instead of an int and wait for it to be set.

Also your logic appears to be wrong in print_time1 because your while loop will never run since exitflag is initially 0, but even if it was 1 it would still just exit immediately. It's not actually waiting on anything.

answered Jan 22, 2015 at 13:23

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.