thread; interrupt_main() doesn't seem to work?

Discussion in 'Python' started by Jerry Sievers, Nov 21, 2004.

  1. Fellow Pythonists; According to the docs

    +-----------------+
    |interrupt_main(|)|
    +-----------------+

    Raise a KeyboardInterrupt in the main thread. A subthread can use
    this function to interrupt the main thread. New in version 2.3.

    Therefore, I was expecting this short test prog to run and then finish
    with the KeyboardInterrupt exception at the bottom in the pause
    routine. It doesn't stop there but I can do a manual keyboard
    interrupt and get the expected bactrace and program exit.

    ---

    from signal import pause
    from socket import socket
    from thread import start_new_thread, interrupt_main
    from time import sleep

    def go():
    print 'go'
    while f.readline():
    print 'line'
    print 'empty'
    interrupt_main()
    print 'done'

    s = socket()
    s.connect(('localhost', 80))
    f = s.makefile()
    print 'connected'

    start_new_thread(go, ())

    sleep(2)
    s.shutdown(2)
    pause() # expecting to get KeyboardInterrupt exception here

    ---

    connected
    go
    empty
    done
    ....hangs here as if interrupt_main() does nothing.

    Manual Control-C required to wake up from pause() and exit.

    Traceback (most recent call last):
    File "test.py", line 23, in ?
    pause() # expecting to get KeyboardInterrupt exception here
    KeyboardInterrupt

    Python 2.3.3 on RedHat 7x.

    Wondering what's wrong?

    Thanks


    --
    -------------------------------------------------------------------------------
    Jerry Sievers 305 854-3001 (home) WWW ECommerce Consultant
    305 321-1144 (mobile http://www.JerrySievers.com/
    Jerry Sievers, Nov 21, 2004
    #1
    1. Advertising

  2. Jerry Sievers

    Steve Holden Guest

    Jerry Sievers wrote:

    > Fellow Pythonists; According to the docs
    >
    > +-----------------+
    > |interrupt_main(|)|
    > +-----------------+
    >
    > Raise a KeyboardInterrupt in the main thread. A subthread can use
    > this function to interrupt the main thread. New in version 2.3.
    >
    > Therefore, I was expecting this short test prog to run and then finish
    > with the KeyboardInterrupt exception at the bottom in the pause
    > routine. It doesn't stop there but I can do a manual keyboard
    > interrupt and get the expected bactrace and program exit.
    >
    > ---
    >
    > from signal import pause
    > from socket import socket
    > from thread import start_new_thread, interrupt_main
    > from time import sleep
    >
    > def go():
    > print 'go'
    > while f.readline():
    > print 'line'
    > print 'empty'
    > interrupt_main()
    > print 'done'
    >
    > s = socket()
    > s.connect(('localhost', 80))
    > f = s.makefile()
    > print 'connected'
    >
    > start_new_thread(go, ())
    >
    > sleep(2)
    > s.shutdown(2)
    > pause() # expecting to get KeyboardInterrupt exception here
    >
    > ---
    >
    > connected
    > go
    > empty
    > done
    > ....hangs here as if interrupt_main() does nothing.
    >
    > Manual Control-C required to wake up from pause() and exit.
    >
    > Traceback (most recent call last):
    > File "test.py", line 23, in ?
    > pause() # expecting to get KeyboardInterrupt exception here
    > KeyboardInterrupt
    >
    > Python 2.3.3 on RedHat 7x.
    >
    > Wondering what's wrong?
    >
    > Thanks
    >
    >

    Perhaps the main thread has to actually be running to respond to the
    raised exception. Did you try a shortish sleep() instead of the pause?
    That would at least test this theory.

    regards
    Steve
    --
    http://www.holdenweb.com
    http://pydish.holdenweb.com
    Holden Web LLC +1 800 494 3119
    Steve Holden, Nov 21, 2004
    #2
    1. Advertising

  3. Steve Holden <> writes:

    > Jerry Sievers wrote:
    >
    > > Fellow Pythonists; According to the docs
    > >
    > > +-----------------+
    > > |interrupt_main(|)|
    > > +-----------------+
    > >
    > > Raise a KeyboardInterrupt in the main thread. A subthread can use
    > > this function to interrupt the main thread. New in version 2.3.
    > >
    > > Therefore, I was expecting this short test prog to run and then finish
    > > with the KeyboardInterrupt exception at the bottom in the pause
    > > routine. It doesn't stop there but I can do a manual keyboard
    > > interrupt and get the expected bactrace and program exit.
    > >
    > > ---
    > >
    > > from signal import pause
    > > from socket import socket
    > > from thread import start_new_thread, interrupt_main
    > > from time import sleep
    > >
    > > def go():
    > > print 'go'
    > > while f.readline():
    > > print 'line'
    > > print 'empty'
    > > interrupt_main()
    > > print 'done'
    > >
    > > s = socket()
    > > s.connect(('localhost', 80))
    > > f = s.makefile()
    > > print 'connected'
    > >
    > > start_new_thread(go, ())
    > >
    > > sleep(2)
    > > s.shutdown(2)
    > > pause() # expecting to get KeyboardInterrupt exception here
    > >
    > > ---
    > >
    > > connected
    > > go
    > > empty
    > > done
    > > ....hangs here as if interrupt_main() does nothing.
    > >
    > > Manual Control-C required to wake up from pause() and exit.
    > >
    > > Traceback (most recent call last):
    > > File "test.py", line 23, in ?
    > > pause() # expecting to get KeyboardInterrupt exception here
    > > KeyboardInterrupt
    > >
    > > Python 2.3.3 on RedHat 7x.
    > >
    > > Wondering what's wrong?
    > >
    > > Thanks
    > >
    > >

    > Perhaps the main thread has to actually be running to respond to the
    > raised exception. Did you try a shortish sleep() instead of the pause?
    > That would at least test this theory.


    Sure did. Tested with the main prog blocked on raw_input() and also
    sleeping(someNum)...

    But you did hit on the problem when you said 'running'.

    I kept testing and found it to work in the following test case;

    While True:
    sleep(1)
    # the exception gets noticed here
    doSomething()

    This is a little curious since a real KeyboardInterrupt does get
    noticed and processed immediatly whereas the one thrown from the
    interrupt_main() routine doesn't get noticed until "between"
    instructions.

    In other words, I can interrupt a pause() at any time by hitting
    Control-C but not by calling interrupt_main().

    Thank you


    --
    -------------------------------------------------------------------------------
    Jerry Sievers 305 854-3001 (home) WWW ECommerce Consultant
    305 321-1144 (mobile http://www.JerrySievers.com/
    Jerry Sievers, Nov 21, 2004
    #3
    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. Bill Green

    &nbsp; in a ListItem doesn't seem to work

    Bill Green, Feb 6, 2004, in forum: ASP .Net
    Replies:
    2
    Views:
    418
    vMike
    Feb 7, 2004
  2. Garrett
    Replies:
    4
    Views:
    4,799
    Garrett
    Dec 2, 2004
  3. tshad
    Replies:
    3
    Views:
    509
    MWells
    Jan 26, 2005
  4. Wiseguy
    Replies:
    2
    Views:
    327
    Jonathan Turkanis
    Jan 18, 2004
  5. §ä´M¦Û¤vªº¤@¤ù¤Ñ

    threading module, call thread.interrupt_main()

    §ä´M¦Û¤vªº¤@¤ù¤Ñ, Oct 8, 2009, in forum: Python
    Replies:
    4
    Views:
    1,235
    Gabriel Genellina
    Oct 14, 2009
Loading...

Share This Page