Update jobs on background thread

This commit is contained in:
Brett Williams
2023-06-02 12:10:49 -05:00
parent 23abbd836c
commit 4331d81a97
3 changed files with 44 additions and 33 deletions

View File

@@ -220,7 +220,7 @@ class ZordonClient:
while True: while True:
self.update_jobs() self.update_jobs()
self.update_servers() self.update_servers()
time.sleep(1) time.sleep(3)
def update_servers(self): def update_servers(self):
servers = self.zeroconf.found_clients() servers = self.zeroconf.found_clients()
@@ -232,6 +232,7 @@ class ZordonClient:
def update_jobs(self, clear_table=False): def update_jobs(self, clear_table=False):
def update_jobs_inner():
def update_row(tree, id, new_values, tags=None): def update_row(tree, id, new_values, tags=None):
for item in tree.get_children(): for item in tree.get_children():
values = tree.item(item, "values") values = tree.item(item, "values")
@@ -241,10 +242,8 @@ class ZordonClient:
job_fetch = self.server_proxy.get_jobs() job_fetch = self.server_proxy.get_jobs()
if job_fetch is not None: if job_fetch is not None:
if len(job_fetch) < len(self.job_cache) or len(job_fetch) == 0: if len(job_fetch) < len(self.job_cache) or len(job_fetch) == 0:
clear_table = True
self.job_cache = job_fetch # update the cache only if its good data
if clear_table:
self.job_tree.delete(*self.job_tree.get_children()) self.job_tree.delete(*self.job_tree.get_children())
self.job_cache = job_fetch # update the cache only if its good data
for job in self.job_cache: for job in self.job_cache:
display_status = job['status'] if job['status'] != 'running' else \ display_status = job['status'] if job['status'] != 'running' else \
('%.0f%%' % (job['percent_complete'] * 100)) # if running, show percentage, otherwise just show status ('%.0f%%' % (job['percent_complete'] * 100)) # if running, show percentage, otherwise just show status
@@ -256,10 +255,20 @@ class ZordonClient:
display_status, display_status,
job['time_elapsed'], job['time_elapsed'],
job['total_frames']) job['total_frames'])
try:
if self.job_tree.exists(job['id']): if self.job_tree.exists(job['id']):
update_row(self.job_tree, job['id'], new_values=values, tags=tags) update_row(self.job_tree, job['id'], new_values=values, tags=tags)
else: else:
self.job_tree.insert("", tk.END, iid=job['id'], values=values, tags=tags) self.job_tree.insert("", tk.END, iid=job['id'], values=values, tags=tags)
except tk.TclError:
pass
if clear_table:
self.job_tree.delete(*self.job_tree.get_children())
x = threading.Thread(target=update_jobs_inner)
x.daemon = True
x.start()
def show_new_job_window(self): def show_new_job_window(self):
new_window = tk.Toplevel(self.root) new_window = tk.Toplevel(self.root)

View File

@@ -34,15 +34,16 @@ class RenderServerProxy:
def request(self, payload, timeout=5): def request(self, payload, timeout=5):
return requests.get(f'http://{self.hostname}:{self.port}/api/{payload}', timeout=timeout) return requests.get(f'http://{self.hostname}:{self.port}/api/{payload}', timeout=timeout)
def get_jobs(self): def get_jobs(self, timeout=5):
all_jobs = self.request_data('jobs') all_jobs = self.request_data('jobs', timeout=timeout)
if all_jobs is not None:
sorted_jobs = [] sorted_jobs = []
if all_jobs:
for status_category in categories: for status_category in categories:
found_jobs = [x for x in all_jobs if x['status'] == status_category.value] found_jobs = [x for x in all_jobs if x['status'] == status_category.value]
if found_jobs: if found_jobs:
sorted_jobs.extend(found_jobs) sorted_jobs.extend(found_jobs)
return sorted_jobs all_jobs = sorted_jobs
return all_jobs
def get_data(self, timeout=5): def get_data(self, timeout=5):
all_data = self.request_data('full_status', timeout=timeout) all_data = self.request_data('full_status', timeout=timeout)

View File

@@ -48,8 +48,9 @@ class ZeroconfServer():
def _browse_services(self): def _browse_services(self):
browser = ServiceBrowser(self.zeroconf, self.service_type, [self._on_service_discovered]) browser = ServiceBrowser(self.zeroconf, self.service_type, [self._on_service_discovered])
def _on_service_discovered(self, zeroconf, service_type, name, state_change=None): def _on_service_discovered(self, zeroconf, service_type, name, state_change):
info = zeroconf.get_service_info(service_type, name) info = zeroconf.get_service_info(service_type, name)
logger.debug(f"Zeroconf: {name} {state_change}")
if service_type == self.service_type: if service_type == self.service_type:
if state_change == ServiceStateChange.Added or state_change == ServiceStateChange.Updated: if state_change == ServiceStateChange.Added or state_change == ServiceStateChange.Updated:
self.client_cache[name] = info self.client_cache[name] = info