Package concurrent_tree_crawler :: Module crawler_thread
[hide private]
[frames] | no frames]

Source Code for Module concurrent_tree_crawler.crawler_thread

 1  import threading 
 2  import logging 
 3   
 4  from concurrent_tree_crawler.common.threads.ex_thread import ExThread 
 5  from concurrent_tree_crawler.abstract_tree_navigator import NavigationException 
 6  from concurrent_tree_crawler.abstract_tree_accessor import NodeAction 
 7   
8 -class CrawlerThread(ExThread):
9 - def __init__(self, navigator, tree, status_queue=None):
10 """ 11 @type navigator: L{NavigatorTreeWrapper} 12 @type tree: L{AbstractTreeAccessor} 13 @type status_queue: L{Queue.Queue} 14 """ 15 ExThread.__init__(self, status_queue) 16 self.__nav = navigator 17 self.__tree = tree 18 self.__should_stop = False
19
20 - def run_with_exception(self):
21 while not self.__should_stop: 22 self.__nav.start_in_sentinel() 23 try: 24 while not self.__should_stop: 25 ret = self.__analyze_children_and_move_to_next_node() 26 if ret == True: 27 self.__log("Exiting") 28 return 29 except NavigationException as _: 30 pass
31
32 - def stop_activity(self):
33 self.__should_stop = True
34
35 - def __analyze_children_and_move_to_next_node(self):
36 """ 37 @return: C{True} if the whole tree has been explored. 38 """ 39 possible_children_names = self.__nav.get_possible_children() 40 node_info = self.__tree.update_and_get_child( 41 self.__nav.get_current_node(), possible_children_names) 42 if node_info is None: 43 self.__log("No traversable children available") 44 return self.__nav.move_to_parent() 45 else: 46 (child, action) = node_info 47 self.__log("Obtained child \"{}\" with action {}".format( 48 child.get_name(), NodeAction.to_str(action))) 49 self.__nav.move_to_child(child) 50 if action == NodeAction.TO_PROCESS: 51 is_leaf = self.__nav.process_node_and_check_if_is_leaf() 52 self.__tree.set_node_type(child, is_leaf) 53 if is_leaf: 54 return self.__nav.move_to_parent() 55 else: 56 return False 57 elif action == NodeAction.TO_VISIT: 58 return False 59 else: 60 assert False, "Unknown action type"
61
62 - def __log(self, message):
63 """ 64 @type message: string 65 """ 66 node = self.__nav.get_current_node() 67 path_str = "/"+("/".join(self.__tree.get_path(node))) 68 logging.debug("thread=\"{}\", node=\"{}\": {}".format( 69 threading.current_thread().name, path_str, message))
70