Skip to content
Snippets Groups Projects
master.py 38.5 KiB
Newer Older
  • Learn to ignore specific revisions
  •         if self.jobs:
                for job in self.jobs:
                    if not self.balancer.applyExceptions(job) and slave_id not in job.blacklist:
                        return job, job.getFrames()
    
            return None, None
    
    def clearMaster(path):
        shutil.rmtree(path)
    
    def createMaster(address, clear, path):
        filepath = os.path.join(path, "blender_master.data")
    
        if not clear and os.path.exists(filepath):
            print("loading saved master:", filepath)
            with open(filepath, 'rb') as f:
                path, jobs, slaves = pickle.load(f)
                
                httpd = RenderMasterServer(address, RenderHandler, path, subdir=False)
                httpd.restore(jobs, slaves)
                
                return httpd
    
        return RenderMasterServer(address, RenderHandler, path)
    
    def saveMaster(path, httpd):
        filepath = os.path.join(path, "blender_master.data")
        
        with open(filepath, 'wb') as f:
            pickle.dump((httpd.path, httpd.jobs, httpd.slaves), f, pickle.HIGHEST_PROTOCOL)
    
    def runMaster(address, broadcast, clear, path, update_stats, test_break):
            httpd = createMaster(address, clear, path)
            httpd.timeout = 1
            httpd.stats = update_stats
    
            if broadcast:
                s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
                s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    
            start_time = time.time() - 2
    
            while not test_break():
                try:
                    httpd.handle_request()
                except select.error:
                    pass
    
                if time.time() - start_time >= 2: # need constant here
                    httpd.timeoutSlaves()
    
                    httpd.updateUsage()
    
                    if broadcast:
                            print("broadcasting address")
                            s.sendto(bytes("%i" % address[1], encoding='utf8'), 0, ('<broadcast>', 8000))
                            start_time = time.time()
    
            httpd.server_close()
            if clear:
                clearMaster(httpd.path)
            else:
                saveMaster(path, httpd)