On Apr 8, 8:09 pm, Adam Skutt <ask...@gmail.com> wrote: > On Apr 8, 5:52 pm, superhac...@gmail.com wrote: > > > > > > > > > > > On Sunday, April 8, 2012 3:55:41 PM UTC-5, Adam Skutt wrote: > > > On Apr 8, 2:45 pm, "superhac...@gmail.com" <superhac...@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! -- http://mail.python.org/mailman/listinfo/python-list