How to terminate a thread in Python without loop in run method?

15,341

This code works fine but there is a need to explicitly flush data from standard output.
Haven't found a way where prints would work without flushing.

import time
from multiprocessing.process import Process
import sys

class LongAction:
    def time_consuming_action(self):
        tmax = 600
        for i in range(tmax):
            print i
            time.sleep(1)
            sys.stdout.flush()
        time.sleep(tmax)
        self.tmax = tmax
        return "Slept well"
        sys.stdout.flush()

class LongActionThread(Process):
    def __init__(self, la_object):
        self.la = la_object
        Process.__init__(self)

    def run(self):
        self.la.time_consuming_action()

if __name__ == "__main__":
    la = LongAction()
    la_thread = LongActionThread(la)
    la_thread.start()

    # After 5 sec i've changed my mind and trying to kill LongActionThread
    time.sleep(5)
    print "Trying to kill LongActionThread"
    la_thread.terminate()
Share:
15,341
ambi
Author by

ambi

Updated on June 04, 2022

Comments

  • ambi
    ambi almost 2 years

    Having class which has a long method.
    Creating a thread for that method.
    How i can kill\terminate this thread?
    Main problem is that i can't check for threading.Event in thread run() method because it doesn't contain loop.
    Similar code as here:

    import time
    import threading
    
    class LongAction:
        def time_consuming_action(self):
            tmax = 600
            for i in range(tmax):
                print i
                time.sleep(1)
            time.sleep(tmax)
            self.tmax = tmax
            return "Slept well"
    
    class LongActionThread(threading.Thread):
        def __init__(self, la_object):
            self.la = la_object
            threading.Thread.__init__(self)
    
        def run(self):
            self.la.time_consuming_action()
    
    
    la = LongAction()
    la_thread = LongActionThread(la)
    la_thread.start()
    
    # After 5 sec i've changed my mind and trying to kill LongActionThread
    time.sleep(5)
    print "Trying to kill LongActionThread"
    la_thread.kill()