开发者

Why a python method not returning?

开发者 https://www.devze.com 2023-01-29 13:55 出处:网络
I have a destroy() method which is called before my thread is coming 开发者_高级运维down. def destroy(self):

I have a destroy() method which is called before my thread is coming 开发者_高级运维down.

def destroy(self):
    self.logger.debug("Instance is being destroyed")
    //do stuff
    self.logger.debug("Instance has been destroyed")

This is the code from where it is called:

if (__name__ == '__main__'):
try:        
    instance = device_instance()             
        while True:
            //do stuff
            if input_string == 'destroy':
                instance.destroy()
                logger.debug("Back in main after destroying")
                break
            else:
                //do stuff
            time.sleep(.100)
except Exception, ex:
    logger.debug("Exception occurred" + str(ex))
except:
    logger.debug("Unhandled exception occurred")

Now when I run it, the problem is I see logging statements "Instance is being destroyed" and "Instance has been destroyed" and I don't see "Back in main after destroying". That means my destroy() is never returning. I tried adding explicit return statement, still the same problem. If I add sys.exit(0) to destroy() at the end, it does raise exception which is eventually caught in main. What could be the issue?


Are you looking at the same logger?


Is your log level above to debug? Try with print

Also, try adding a log before the call.


I think we'll need a bit more information than this -- probably about the context of 'do something' and input_string

I put this into a piece of code:

import logging                                                                                          
import time                                                                                             

logger = logging.getLogger('')                                                                          

class device_instance(object):                                                                          

    def destroy(self):                                                                                  
        self.logger.warning('Instance is being destroyed')                                              
        # do stuff                                                                                      
        self.logger.warning('Instance is destroyed')                                                    

input_strings = ['one', 'two', 'destroy']                                                               

if (__name__ == '__main__'):                                                                            
    logging.basicConfig()                                                                               
    try:                                                                                                
        instance = device_instance()                                                                    
        instance.logger = logger                                                                        

        gen = input_strings.__iter__()                                                                  

        while True:                                                                                     
            #do stuff                                                                                   
            try:                                                                                        
                input_string = gen.next()                                                               
            except StopIteration:                                                                       
                input_string = 'destroy'                                                                

            if input_string == 'destroy':                                                               
                instance.destroy()                                                                      
                logger.warning("Back in main after destroying")                                         
                break                                                                                   
            else:                                                                                       
                time.sleep(.100)                                                                        
    except:                                                                                             
        logger.exception("Unhandled exception occurred")

This outputs what you'd expect:

WARNING:root:Instance is being destroyed                                                                    
WARNING:root:Instance is destroyed                                                                          
WARNING:root:Back in main after destroying

So something else is at play, I think.

0

精彩评论

暂无评论...
验证码 换一张
取 消