Add long_polling_jobs to API (#78)

This commit is contained in:
2024-02-13 13:11:56 -06:00
committed by GitHub
parent ecf836c235
commit a0729d71f1
2 changed files with 22 additions and 6 deletions

View File

@@ -55,15 +55,30 @@ def sorted_jobs(all_jobs, sort_by_date=True):
@server.get('/api/jobs') @server.get('/api/jobs')
def jobs_json(): def jobs_json():
try: try:
hash_token = request.args.get('token', None)
all_jobs = [x.json() for x in RenderQueue.all_jobs()] all_jobs = [x.json() for x in RenderQueue.all_jobs()]
job_cache_int = int(json.dumps(all_jobs).__hash__()) job_cache_int = int(json.dumps(all_jobs).__hash__())
job_cache_token = num_to_alphanumeric(job_cache_int) job_cache_token = num_to_alphanumeric(job_cache_int)
if hash_token and hash_token == job_cache_token:
return [], 204 # no need to update
return {'jobs': all_jobs, 'token': job_cache_token} return {'jobs': all_jobs, 'token': job_cache_token}
except Exception as e: except Exception as e:
logger.exception(f"Exception fetching all_jobs_cached: {e}") logger.exception(f"Exception fetching jobs_json: {e}")
return [], 500
@server.get('/api/jobs_long_poll')
def long_polling_jobs():
try:
hash_token = request.args.get('token', None)
start_time = time.time()
while True:
all_jobs = jobs_json()
if all_jobs['token'] != hash_token:
return all_jobs
# Break after 30 seconds to avoid gateway timeout
if time.time() - start_time > 30:
return [], 204
time.sleep(1)
except Exception as e:
logger.exception(f"Exception fetching long_polling_jobs: {e}")
return [], 500 return [], 500

View File

@@ -126,8 +126,9 @@ class RenderServerProxy:
self.__update_job_cache(timeout, ignore_token) self.__update_job_cache(timeout, ignore_token)
return self.__jobs_cache.copy() if self.__jobs_cache else None return self.__jobs_cache.copy() if self.__jobs_cache else None
def __update_job_cache(self, timeout=5, ignore_token=False): def __update_job_cache(self, timeout=30, ignore_token=False):
url = f'jobs?token={self.__jobs_cache_token}' if self.__jobs_cache_token and not ignore_token else 'jobs' url = f'jobs_long_poll?token={self.__jobs_cache_token}' if (self.__jobs_cache_token and
not ignore_token) else 'jobs'
status_result = self.request_data(url, timeout=timeout) status_result = self.request_data(url, timeout=timeout)
if status_result is not None: if status_result is not None:
sorted_jobs = [] sorted_jobs = []