Interrupting a blocking function frolm another thread.

superhac007 at gmail.com superhac007 at gmail.com
Mon Apr 9 21:26:15 EDT 2012


On Monday, April 9, 2012 9:39:54 AM UTC-5, super... at gmail.com wrote:
> On Apr 8, 8:09 pm, Adam Skutt <ask... at gmail.com> wrote:
> > 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
> 
> Thanks for the through explanation.  I now know what I need to do.
> 
> 
> Thanks again!

Adam,

I got everything working today asynchronously with your help.   I really appreciate the information that you provided.  Since I am very new to Python development your input and direction greatly expedited what I needed.  Its people like you that make the world a better place.   If you ever need anything don't hesitate to email me personally.

In a nut a shell I ended up with a thread that had the following:

def startAsyncQ():
    global stop
    while stop != True:
        asyncore.loop(count=1)

I could then could control the starting and stopping from another thread.  It worked like a champ.

Again, Thanks for your help!!!!!





More information about the Python-list mailing list