Skip to content
Snippets Groups Projects
master.py 38.6 KiB
Newer Older

    def __iter__(self):
        for job in self.jobs:
            yield job

    def newDispatch(self, slave_id):
        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)