Interrupting a blocking function frolm another thread.

Adam Skutt askutt at gmail.com
Sun Apr 8 21:09:01 EDT 2012


On Apr 8, 5:52 pm, superhac... at gmail.com wrote:
> On Sunday, April 8, 2012 3:55:41 PM UTC-5, Adam Skutt wrote:
> > On Apr 8, 2:45 pm, "superhac... at gmail.com" <superhac... at gmail.com>
> > wrote:
> > > I am using the python module nfqueue-bindings which is a nfqueue
> > > packet intercepting module.  It uses the following snippet of code to
> > > start the process:
>
> > > print "trying to run"
> > > try:
> > >      q.try_run()
> > >      except KeyboardInterrupt, e:
> > >      print "interrupted"
>
> > > The q.try_run() method blocks.   I would like to be able to interrupt
> > > this the same way you can hit control-c to unblock it, but from
> > > another thread.  Does anyone have any idea on how to do this?  Is
> > > there some sort of Exception I can generate from another thread that
> > > would do this?
>
> > The simplest and most reliable way will be to modify the asynchronous
> > I/O example athttps://www.wzdftpd.net/redmine/projects/nfqueue-bindings/repository/...
> > to do what you want.  The classical way to accomplish this would be to
> > create a second I/O descriptor (via os.pipe or similiar) and wait for
> > that descriptor in the same async I/O loop.  When you want to stop the
> > loop, send a message (could be a single byte) to the second descriptor
> > and then respond appropriately in your asynchronous I/O handler.
>
> > However, simply ignoring the nfqueue socket while doing other
> > processing might be acceptable too.  I would read the documentation
> > and ask questions carefully before taking that approach, as it may
> > lead to lost data or other problems.  The viability of this approach
> > depends heavily on your application.
>
> > Adam
>
> Thanks for the reply Adam.  I am still confused with the example with the example you linked to.  I have only been working with Python for a couple of weeks, but I am fluent with C.  Given the example you linked to, are you saying that this is the run loop for asynchronous comm that a end user of the module could use?  Or is this something with the nfqueue-bindings module that I would I have to modify.  I don't recognize the the main loop in the example.

asyncore is a standard python module for handling asynchronous I/O
operations (i.e., select/poll operations).  The main loop in that
example is handled by the 'asyncore.loop()' call, which just calls
select() in a loop until all channels are closed.  You're looking at
the standard Python library technique for an asynchronous I/O event
loop.

asyncore.file_dispatcher enables use of asyncore.loop() with standard
UNIX FDs.  nfqueue.queue objects provide access to their underlying
FDs so you can wait on them.  asyncore.loop() is the main loop of the
application, performing endless select/poll waits and calling
'handle_read' whenever the netfilter FD has data for reading.  You can
find more details about the module in the Python library docs.

Since your code is Linux specific, you can always call os.select() or
os.poll() if it makes you feel better, but I don't think that's going
to simplify anything here.

Hopefully that helps you.

Adam



More information about the Python-list mailing list