kill thread

M

Mathieu Prevot

Hi,

I have a threading.Thread class with a "for i in range(1,50)" loop
within. When it runs and I do ^C, I have the error [1] as many as
loops. I would like to catch this exception (and if possible do some
cleanup like in C pthreads) so the program finishes cleanly. Where and
how can I do this ? in __run__ ? __init__ ? a try/except stuff ?

Thanks,
Mathieu

[1]:
^CException in thread Thread-1:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/threading.py",
line 486, in __bootstrap_inner
self.run()
File "./youfetch.py", line 148, in run
self.getids()
File "./youfetch.py", line 145, in getids
self.ids.append(self.getidsatpage(i))
File "./youfetch.py", line 138, in getidsatpage
self.child = subprocess.Popen(cmd.split(),stdout=subprocess.PIPE)
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/subprocess.py",
line 594, in __init__
errread, errwrite)
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/subprocess.py",
line 1011, in _execute_child
self.pid = os.fork()
KeyboardInterrupt
 
M

Miki

Hello,
I have a threading.Thread class with a "for i in range(1,50)" loop
within. When it runs and I do ^C, I have the error [1] as many as
loops. I would like to catch this exception (and if possible do some
cleanup like in C pthreads) so the program finishes cleanly. Where and
how can I do this ? in __run__ ? __init__ ? a try/except stuff ?
You can have a try/except KeyboardException around the thread code.

HTH,
 
M

Mathieu Prevot

2008/8/8 Miki said:
Hello,
I have a threading.Thread class with a "for i in range(1,50)" loop
within. When it runs and I do ^C, I have the error [1] as many as
loops. I would like to catch this exception (and if possible do some
cleanup like in C pthreads) so the program finishes cleanly. Where and
how can I do this ? in __run__ ? __init__ ? a try/except stuff ?
You can have a try/except KeyboardException around the thread code.

HTH,

Of course, but I don't know where. I placed this inside loop, within
called functions from the loop, I still have the problem.

Mathieu
 
B

bockman

2008/8/8 Miki said:
Hello,
I have a threading.Thread class with a "for i in range(1,50)" loop
within. When it runs and I do ^C, I have the error [1] as many as
loops. I would like to catch this exception (and if possible do some
cleanup like in C pthreads) so the program finishes cleanly. Where and
how can I do this ? in __run__ ? __init__ ? a try/except stuff ?
You can have a try/except KeyboardException around the thread code.

Of course, but I don't know where. I placed this inside loop, within
called functions from the loop, I still have the problem.

Mathieu

Try this:

loop_completed = True
for i in range(1,50):
try:
# your code here
except KeyboardException:
loop_completed = False
break # this breaks the loop
# end loop
if loop_completed:
# code to be executed in case of normal completion
else:
# code to be executed in case of interruption
# code to be executed in both cases
 
M

Mathieu Prevot

2008/8/8 said:
2008/8/8 Miki said:
I have a threading.Thread class with a "for i in range(1,50)" loop
within. When it runs and I do ^C, I have the error [1] as many as
loops. I would like to catch this exception (and if possible do some
cleanup like in C pthreads) so the program finishes cleanly. Where and
how can I do this ? in __run__ ? __init__ ? a try/except stuff ?
You can have a try/except KeyboardException around the thread code.

Of course, but I don't know where. I placed this inside loop, within
called functions from the loop, I still have the problem.

Mathieu

Try this:

loop_completed = True
for i in range(1,50):
try:
# your code here
except KeyboardException:
loop_completed = False
break # this breaks the loop
# end loop
if loop_completed:
# code to be executed in case of normal completion
else:
# code to be executed in case of interruption
# code to be executed in both cases

Thanks for answers. My code sheme was the following: main() starts 2
thread trees (threads of threads of ...) and some of these have "for"
loops. These loops needed to be as you recommended:

for ... :
try:
# instructions
except KeyboardInterrupt:
# cleaning instructions
break

The problem with atexit.register is that is doesn't work in case of
system signals catches (http://tinyurl.com/6kdaba)

Thanks,
Mathieu

_____________________________________________
def main():
query1 = Thread1
batch1 = Thread2
while True:
try:
#some code for updating / synchronize / etc threads
except KeyboardInterrupt:
try:
query1.terminate()
batch1.terminate()
except:
pass
finally:
break
_____________________________________________


I used also from http://sebulba.wikispaces.com/recipe+thread2
the following new Thread class:

_____________________________________________
import threading, inspect, ctypes

def _async_raise(tid, exctype):
"""raises the exception, performs cleanup if needed"""
if not inspect.isclass(exctype):
raise TypeError("Only types can be raised (not instances)")
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid,
ctypes.py_object(exctype))
if res == 0:
raise ValueError("invalid thread id")
elif res != 1:
# """if it returns a number greater than one, you're in trouble,
# and you should call it again with exc=NULL to revert the effect"""
ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, 0)
raise SystemError("PyThreadState_SetAsyncExc failed")

class Thread(threading.Thread):
def _get_my_tid(self):
"""determines this (self's) thread id"""
if not self.isAlive():
raise threading.ThreadError("the thread is not active")

# do we have it cached?
if hasattr(self, "_thread_id"):
return self._thread_id

# no, look for it in the _active dict
for tid, tobj in threading._active.items():
if tobj is self:
self._thread_id = tid
return tid

raise AssertionError("could not determine the thread's id")

def raise_exc(self, exctype):
"""raises the given exception type in the context of this thread"""
_async_raise(self._get_my_tid(), exctype)

def terminate(self):
"""raises SystemExit in the context of the given thread, which should
cause the thread to exit silently (unless caught)"""
self.raise_exc(SystemExit)
_____________________________________________
 

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

Similar Threads


Members online

Forum statistics

Threads
473,961
Messages
2,570,131
Members
46,689
Latest member
liammiller

Latest Threads

Top