Skip to content

feat: improve task polling with exponential backoff #408

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 6, 2025

Conversation

tdstein
Copy link
Collaborator

@tdstein tdstein commented May 6, 2025

Implements an improved task polling mechanism with configurable exponential backoff to reduce the number of API calls for long-running tasks. This helps to minimize resource consumption on the Connect server while still providing responsive feedback.

🤖 Generated with Claude Code

Implements an improved task polling mechanism with configurable exponential backoff to reduce
the number of API calls for long-running tasks. This helps to minimize resource consumption
on the Connect server while still providing responsive feedback.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
Copy link

github-actions bot commented May 6, 2025

☂️ Python Coverage

current status: ✅

Overall Coverage

Lines Covered Coverage Threshold Status
1889 1780 94% 0% 🟢

New Files

No new covered files...

Modified Files

File Coverage Status
src/posit/connect/tasks.py 100% 🟢
TOTAL 100% 🟢

updated for commit: 3d6971b by action🐍

@tdstein tdstein requested review from jonkeane, nealrichardson, cgraham-rs and a team and removed request for jonkeane and nealrichardson May 6, 2025 18:42
Copy link
Collaborator

@mconflitti-pbc mconflitti-pbc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@tdstein tdstein requested a review from Copilot May 6, 2025 18:46
Copy link

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This pull request improves task polling by introducing an exponential backoff mechanism with configurable parameters to reduce API call frequency for long-running tasks. Key changes include:

  • Adding a new wait_for method signature that accepts initial_wait, max_wait, and backoff parameters
  • Extending task polling tests to verify both exponential backoff and non-backoff configurations
  • Updating documentation within the wait_for method to clearly explain the new behavior

Reviewed Changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
tests/posit/connect/test_tasks.py Added tests for exponential backoff and no-backoff scenarios
src/posit/connect/tasks.py Updated wait_for to support configurable backoff parameters and improved docstring

@tdstein tdstein merged commit 8add419 into main May 6, 2025
40 checks passed
@tdstein tdstein deleted the tdstein-task-polling branch May 6, 2025 18:48
while not self.is_finished:
self.update()

# Wait client-side
time.sleep(wait_time)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was trying to suggest using the wait=N query argument to implement long-polling and not do any sleeping on the client.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given that the sdk's http client is not async, I am curious what relying on long polling would gain here. Could be mistaken but whether you have a long standing connection or sleep, both are blocking until the response is returned right? If that is accurate then having the blocking driven by the client may still give this a slight edge.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

when you call /tasks/DECAFBAD?wait=10, the API call will wait up to ten seconds or until the task is complete before returning. read that call as "accumulate data for up to 10 seconds before returning the result".

the call returns as soon as the task is complete.

when the client is sleeping, it has to wait the entire duration before it can make an API call to fetch additional data. if the task completes after 1s, you still need to wait the remaining 9s.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the rsconnect R package uses wait=1 to provide fairly fast feedback while not issuing an excessive number of HTTP requests.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the call returns as soon as the task is complete.
that makes sense then! I didnt know that it would return early.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I completely spaced on the API functionality for sleeps. I'll modify the implementation to use it.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Much better :) #409

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants