Exemplo n.º 1
0
    def alloc_task_no(self, child_path):
        info('alloc_task_no', 'try to alloc task no for %s'%child_path)
        
        tx = self.zk.transaction()
        node_version =  self.zk.get(child_path)[1].version
        
        node_state = SpiderNodeState.loads(self.zk.get(child_path)[0])
        node_state.state = SpiderNodeState.READY
        node_state.task_no = -1
        
        website = child_path.split('/')[-2]
        
        #首先检查该网站下是否有错误节点
        childs = self.zk.get_children("/spider/data/error/%s" % website)
        if len(childs)>0:
            info('alloc_task_no','alloc error data node')
            error_node_state = SpiderDataState.loads(self.zk.get("/spider/data/error/%s/%s"%(website,childs[0]))[0])
            tx.delete("/spider/data/error/%s/%s"%(website,childs[0]))
            
            node_state.task_no =  error_node_state.task_no
        else:
            path = "/spider/data/running/%s" % website
            data = self.zk.get(path)
            bitmap = pickle.loads(data[0])
            
            for i in xrange(len(bitmap)):

                if not bitmap[i]:
                    bitmap[i] = 1
                    self.zk.set(path, pickle.dumps(bitmap))
                    node_state.task_no =  i;
                    break
        info('alloc_task_no', 'alloc task no %s for %s'%(node_state.task_no,child_path))
        
        tx.set_data(child_path, value=node_state.dumps())
        tx.commit()