Skip to content

add upkeep method to AsyncSession#640

Open
kadamprashant1 wants to merge 1 commit intolexiforest:mainfrom
kadamprashant1:support_upkeep_for_AsyncSession
Open

add upkeep method to AsyncSession#640
kadamprashant1 wants to merge 1 commit intolexiforest:mainfrom
kadamprashant1:support_upkeep_for_AsyncSession

Conversation

@kadamprashant1
Copy link

This change introduces the upkeep() asynchronous method to the AsyncSession class, bringing feature parity with the synchronous Session class and enhancing its capabilities for long-running applications.

@lexiforest
Copy link
Owner

Since there is no multi interface for upkeep. I guess this is the only way to send ping frames, I will have some style fixes and then merge. Thanks.

@kadamprashant1
Copy link
Author

Thanks @lexiforest!

@Manouchehri
Copy link

Any progress on this?

@sarperavci
Copy link
Contributor

I'd suggest this approach rather than processing handles concurrently. It's safer against pool starvation since each handle is returned immediately after upkeep and it can also be used as a standalone utility:

async def upkeep(session: curl_cffi.AsyncSession) -> list[int]:
    """
    Performs connection upkeep for all idle connections in the pool.
    """
    session._check_session_closed()
    
    results = []
    curls: List[curl_cffi.Curl] = []
    
    # Drain pool
    while True:
        try:
            curls.append(session.pool.get_nowait())
        except asyncio.QueueEmpty:
            break
    
    # Upkeep and return immediately
    for curl in curls:
        if curl:
            results.append(curl.upkeep())
        session.pool.put_nowait(curl)
    
    return results

Since curl.upkeep() just calls curl_easy_upkeep() (which is a quick C call to send PING frames), there's no need for run_in_executor.

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.

4 participants