-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
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
Avoid creating a future on every websocket receive #8498
Conversation
Only create a future on close if we need to wait for the receive to finish
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## master #8498 +/- ##
=======================================
Coverage 97.61% 97.61%
=======================================
Files 107 107
Lines 33104 33159 +55
Branches 3892 3895 +3
=======================================
+ Hits 32314 32369 +55
Misses 571 571
Partials 219 219
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. |
|
I think this needs a test where concurrent tasks close the connection at the same time before receive is done in another task |
tests/test_client_ws_functional.py
Outdated
| app = web.Application() | ||
| app.router.add_route("GET", "/", handler) | ||
| client = await aiohttp_client(app) | ||
| ws = client_ws = await client.ws_connect("/") |
Check notice
Code scanning / CodeQL
Unused local variable Note test
tests/test_client_ws_functional.py
Outdated
|
|
||
|
|
||
| async def test_concurrent_close_multiple_tasks(aiohttp_client: Any) -> None: | ||
| client_ws = None |
Check notice
Code scanning / CodeQL
Unused local variable Note test
Co-authored-by: Sam Bull <git@sambull.org>
|
thanks |
Backport to 3.10: 💔 cherry-picking failed — conflicts found❌ Failed to cleanly apply 7bf6ee1 on top of patchback/backports/3.10/7bf6ee1719e8b98d4aa9c7578ed016123ee888d9/pr-8498 Backporting merged PR #8498 into master
🤖 @patchback |
Co-authored-by: Sam Bull <git@sambull.org> (cherry picked from commit 7bf6ee1)
…bsocket receive (#8503) Co-authored-by: Sam Bull <git@sambull.org>
What do these changes do?
We should only create a future on close if we wait for the receive to finish. Instead of making the future every time
receiveis called, we should only create it when we are closing and let theclosecall await it only ifreceiveis waiting. Sincecloseis called far less frequently thanreceivein most cases, this is far more efficient.There was also a nice decrease in
set_resultcalls and a reduction of ~1000 future creations per minute on an HA install with 14 WebSocket connections open. Users with many WebSocket connections will see a much more substantial drop. WebSockets should scale better with this change, especially if they are highly active.The future was added in ae38c4a , and the
test_concurrent_closetests still pass with only creating the future on closeAre there changes in behavior for the user?
no
Is it a substantial burden for the maintainers to support this?
no
Related issue number
Checklist
CONTRIBUTORS.txtCHANGES/foldername it
<issue_or_pr_num>.<type>.rst(e.g.588.bugfix.rst)if you don't have an issue number, change it to the pull request
number after creating the PR
.bugfix: A bug fix for something the maintainers deemed animproper undesired behavior that got corrected to match
pre-agreed expectations.
.feature: A new behavior, public APIs. That sort of stuff..deprecation: A declaration of future API removals and breakingchanges in behavior.
.breaking: When something public is removed in a breaking way.Could be deprecated in an earlier release.
.doc: Notable updates to the documentation structure or buildprocess.
.packaging: Notes for downstreams about unobvious side effectsand tooling. Changes in the test invocation considerations and
runtime assumptions.
.contrib: Stuff that affects the contributor experience. e.g.Running tests, building the docs, setting up the development
environment.
.misc: Changes that are hard to assign to any of the abovecategories.
Make sure to use full sentences with correct case and punctuation,
for example:
Use the past tense or the present tense a non-imperative mood,
referring to what's changed compared to the last released version
of this project.