Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Running function as a thread in background python and exit before its application

I'm executing a function as a thread in python. Now, the program will wait for the function to execute and then terminate after its completion.

My target is to starting the background thread and closing the program calling it. how can we do it. As in below code, the thread will take 30 min to execute. I want to stop the main program after calling the thread and let the thread run in background.

thread = threading.Thread(target=function_that_runs_for_30_min)
thread.start()
print "Thread Started"
quit()
like image 323
Sumit Paliwal Avatar asked Sep 06 '25 04:09

Sumit Paliwal


1 Answers

You cannot do that directly. A thread is just a part of a process. Once the process exits, all the threads are gone. You need to create a background process to achieve that.

You cannot use the multiprocessing module either because it is a package that supports spawning processes using an API similar to the threading module (emphasize mine). As such it has no provision to allow a process to run after the end of the calling one.

The only way I can imagine is to use the subprocess module to restart the script with a specific parameter. For a simple use case, adding a parameter is enough, for more complex command line parameters, the module argparse should be used. Example of code:

import subprocess
import sys

# only to wait some time...
import time

def f(name):
    "Function that could run in background for a long time (30')"
    time.sleep(5)
    print 'hello', name

if __name__ == '__main__':
    if (len(sys.argv) > 1) and (sys.argv[1] == 'SUB'):
        # Should be an internal execution: start the lengthy function
        f('bar')
    else:
        # normal execution: start a subprocess with same script to launch the function
        p = subprocess.Popen("%s %s SUB" % (sys.executable, sys.argv[0]))
        # other processing...
        print 'END of normal process'

Execution:

C:\>python foo.py
END of normal process

C:\>

and five seconds later:

hello bar
like image 77
Serge Ballesta Avatar answered Sep 08 '25 18:09

Serge Ballesta