kill thread

Discussion in 'Python' started by Mathieu Prevot, Aug 7, 2008.

  1. 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
    Mathieu Prevot, Aug 7, 2008
    #1
    1. Advertising

  2. Mathieu Prevot

    Miki Guest

    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,
    --
    Miki <>
    http://pythonwise.blogspot.com
    Miki, Aug 8, 2008
    #2
    1. Advertising

  3. 2008/8/8 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,
    > --
    > Miki


    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
    Mathieu Prevot, Aug 8, 2008
    #3
  4. Mathieu Prevot

    Guest

    On 8 Ago, 10:03, "Mathieu Prevot" <> wrote:
    > 2008/8/8 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,
    > > --
    > > Miki

    >
    > 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
    , Aug 8, 2008
    #4
  5. 2008/8/8 <>:
    > On 8 Ago, 10:03, "Mathieu Prevot" <> wrote:
    >> 2008/8/8 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,
    >> > --
    >> > Miki

    >>
    >> 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)
    _____________________________________________
    Mathieu Prevot, Aug 9, 2008
    #5
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. chintan jajal via .NET 247

    Delegate Endinvoke Kill thread

    chintan jajal via .NET 247, May 24, 2005, in forum: ASP .Net
    Replies:
    1
    Views:
    6,859
    Richard Grimes [MVP]
    Jun 6, 2005
  2. Rasmus B. Nielsen

    thread kill ?

    Rasmus B. Nielsen, Aug 30, 2003, in forum: Java
    Replies:
    0
    Views:
    473
    Rasmus B. Nielsen
    Aug 30, 2003
  3. bm
    Replies:
    11
    Views:
    6,147
  4. Jerry Sievers

    thread, threading; how to kill a thread?

    Jerry Sievers, Nov 17, 2004, in forum: Python
    Replies:
    12
    Views:
    1,140
    Mustafa Demirhan
    Nov 19, 2004
  5. Charles Oliver Nutter
    Replies:
    43
    Views:
    613
    Roger Pack
    Mar 25, 2008
Loading...

Share This Page