How can I kill a running thread when exiting from __main__

C

care02

Hi!

I have the following problem: I have written a short Python server
that creates an indefinite simulation thread that I want to kill when
quitting (Ctrl-C) from Python. Googling around has not given me any
hints on how to cleanly kill running threads before exiting. Any help
is appreciated!

Carl

### CODE EXTRACT ###

import pythoncom

class QueueThread( threading.Thread):
def __init__(self, command):
threading.Thread.__init__(self)
self.command = command

def run(self):
pythoncom.CoInitialize()
try:
object = Dispatch('application')
execute = getattr(object, 'Execute')
execute(self.command )
finally:
object = None
pythoncom.CoUnitialize()

queuethread = QueueThread("queuehandler")
queuethread.setDaemon(True)
queuethread.start()

## How can I kill "queuethread" when exiting (Ctrl-C)?
 
S

Steve Holden

Hi!

I have the following problem: I have written a short Python server
that creates an indefinite simulation thread that I want to kill when
quitting (Ctrl-C) from Python. Googling around has not given me any
hints on how to cleanly kill running threads before exiting. Any help
is appreciated!

Carl

### CODE EXTRACT ###

import pythoncom

class QueueThread( threading.Thread):
def __init__(self, command):
threading.Thread.__init__(self)
self.command = command

def run(self):
pythoncom.CoInitialize()
try:
object = Dispatch('application')
execute = getattr(object, 'Execute')
execute(self.command )
finally:
object = None
pythoncom.CoUnitialize()

queuethread = QueueThread("queuehandler")
queuethread.setDaemon(True)
queuethread.start()

## How can I kill "queuethread" when exiting (Ctrl-C)?
The only way to do this is to have the thread regularly examine a
"please quit" flag that is set from the main thread when termination is
required.

There have been many suggestions to allow external forced termination of
threads, but this is impossible to specify in a clean way that is both
platform-independent and reliable, so it's not likely to happen.

regards
Steve
 
K

kyosohma

Hi!

I have the following problem: I have written a short Python server
that creates an indefinite simulation thread that I want to kill when
quitting (Ctrl-C) from Python. Googling around has not given me any
hints on how to cleanly kill running threads before exiting. Any help
is appreciated!

Carl

### CODE EXTRACT ###

import pythoncom

class QueueThread( threading.Thread):
def __init__(self, command):
threading.Thread.__init__(self)
self.command = command

def run(self):
pythoncom.CoInitialize()
try:
object = Dispatch('application')
execute = getattr(object, 'Execute')
execute(self.command )
finally:
object = None
pythoncom.CoUnitialize()

queuethread = QueueThread("queuehandler")
queuethread.setDaemon(True)
queuethread.start()

## How can I kill "queuethread" when exiting (Ctrl-C)?

If you can get the pid of the process you created, you should be able
to use the killProcName function that's included with the win32
package...if you're server is a Windows box. You should be able to use
the join() method if you don't set your thread to a Daemon.

This post talks about using the os module to kill a thread as well:

http://www.daniweb.com/techtalkforums/thread36752.html

The wxPython wiki has one of the best threading examples I've seen:
http://wiki.wxpython.org/index.cgi/LongRunningTasks

Mike
 
S

skip

Steve> The only way to do this is to have the thread regularly examine a
Steve> "please quit" flag that is set from the main thread when
Steve> termination is required.

I thought the process would terminate when only daemon threads were left.

Skip
 
S

Steve Holden

Steve> The only way to do this is to have the thread regularly examine a
Steve> "please quit" flag that is set from the main thread when
Steve> termination is required.

I thought the process would terminate when only daemon threads were left.

Skip

So it does - according to the documentation. In which case why is the OP
asking the question, since his code sets the queuethread daemonic before
starting it?

Maybe, then, the real answer is "just exit from the main thread"?

regards
Steve
 
S

skip

Steve> Maybe, then, the real answer is "just exit from the main thread"?

Yes, I believe so. If that's not what's happening I would look to see if
there is another thread which wasn't marked as a daemon.

Skip
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top