◐ Shell
reader mode source ↗
Skip to content

gh-125997: suggest efficient alternatives for time.sleep(0)#128752

Merged
picnixz merged 2 commits into
python:mainfrom
picnixz:doc/time/sleep-125997
Jan 18, 2025
Merged

gh-125997: suggest efficient alternatives for time.sleep(0)#128752
picnixz merged 2 commits into
python:mainfrom
picnixz:doc/time/sleep-125997

Conversation

@picnixz

@picnixz picnixz commented Jan 12, 2025

Copy link
Copy Markdown
Member

After a discussion with Victor and because #128274 is not convincing enough, we decide to:

  • keep the current behaviour of time.sleep(), and
  • document efficient (and probably semantically more correct) alternatives for time.sleep(0).

See #125997 (comment) for more details.


📚 Documentation preview 📚: https://cpython-previews--128752.org.readthedocs.build/

The implementation of `time.sleep()` changed in Python 3.11 and relies
on `clock_nanosleep()` or `nanosleep()` since then. This introduced a
regression in code using `time.sleep(0)` for a syscall "no-op", polling
or momentarily suspending the caller's thread.

To alleviate the performance regression, we suggest some alternatives
depending on the caller's needs.
@picnixz picnixz requested a review from vstinner January 12, 2025 18:48
@picnixz

picnixz commented Jan 12, 2025

Copy link
Copy Markdown
Member Author

@hauntsaninja and @charles-cooper: I would appreciate if you can share your thoughts on those suggestions as you were also involved in the other PR's discussion.

@charles-cooper

Copy link
Copy Markdown

i think it's interesting that select() is already mentioned as a possible implementation for time.sleep(), so maybe the approach in #128274 is valid actually.

https://github.com/python/cpython/pull/128752/files#diff-6203e0fc16084e67996c5bdd5e1caf4cc4699f67fde5da0abebe2ca239278ed4R402

besides that, i would just mention that clock_nanosleep may sleep at least 50us on linux. (i mean this is arguably a linux bug, but it is kind of surprising to users that sleep(0) sleeps a lot longer than one might expect).

@picnixz

picnixz commented Jan 12, 2025

Copy link
Copy Markdown
Member Author

sleep(0) sleeps a lot longer than one might expect

Actually, sleep() does not provide any guarantee that it will sleep exactly of the amount being requested. Granted it's surprising, but it's still documented in man nanosleep and others (sleep says "sleep() causes the calling thread to sleep either until the number of real-time seconds specified in seconds have elapsed" without saying "at least until" but I think it should be understood like this).

(), so maybe the approach in #128274 is valid actually.

While it's mentioned like that, I think it's wrong in the first place to rely on select() to implement sleep() (as I said on the issue). But since it's documented as a fallback, I think we should live with this discrepency, but we shouldn't make the "correct" implementation uses something else (namely "select()"). Even if the correct choice (clock_nanosleep/nanosleep) looks "buggy", that's what the caller should expect (I mean, I would expect time.sleep to rely on sleep-like functions).

Another solution is to check if we're on FreeBSD or not, but this makes maintainance harder. Also, for those reading the PR only, the sleep gap only happens at t = 0 and not at t = 1e-9 (for t = 1e-9, select() is still as slow as clock_nanosleep()). It's just that at t = 0, it returns immediately. So we can also just skip t = 0 calls on non-Windows platforms directly.

@hauntsaninja hauntsaninja left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hide comment

Thanks, this PR looks great, I think this is right approach.

I would not document current implementation choices of default Linux scheduler, especially since we've currently only had one report in >2 years. (If it does come up again, we can mention os.sched_setscheduler / PR_SET_TIMERSLACK)

@vstinner vstinner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Hide comment

LGTM

@picnixz

picnixz commented Jan 18, 2025

Copy link
Copy Markdown
Member Author

@vstinner I plan to merge this PR with no commit message and the current PR title. I don't want to expand more on the rationale in the commit and I think it's better to look at the issue directly. WDYT?

@vstinner vstinner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Hide comment

LGTM. Go ahead.

@picnixz picnixz merged commit f4afaa6 into python:main Jan 18, 2025
@picnixz picnixz deleted the doc/time/sleep-125997 branch January 18, 2025 11:02
@picnixz picnixz added needs backport to 3.12 only security fixes needs backport to 3.13 bugs and security fixes labels Jan 18, 2025
@miss-islington-app

Copy link
Copy Markdown

Thanks @picnixz for the PR 🌮🎉.. I'm working now to backport this PR to: 3.13.
🐍🍒⛏🤖

@miss-islington-app

Copy link
Copy Markdown

Thanks @picnixz for the PR 🌮🎉.. I'm working now to backport this PR to: 3.12.
🐍🍒⛏🤖

miss-islington pushed a commit to miss-islington/cpython that referenced this pull request Jan 18, 2025
…ythonGH-128752)

(cherry picked from commit f4afaa6)

Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
@miss-islington-app

Copy link
Copy Markdown

Sorry, @picnixz, I could not cleanly backport this to 3.12 due to a conflict.
Please backport using cherry_picker on command line.

cherry_picker f4afaa6f1190fbbea3e27c590096951d8ffdfb71 3.12

@bedevere-app

bedevere-app Bot commented Jan 18, 2025

Copy link
Copy Markdown

GH-128984 is a backport of this pull request to the 3.13 branch.

@bedevere-app bedevere-app Bot removed the needs backport to 3.13 bugs and security fixes label Jan 18, 2025
@bedevere-app

bedevere-app Bot commented Jan 18, 2025

Copy link
Copy Markdown

GH-128985 is a backport of this pull request to the 3.12 branch.

@bedevere-app bedevere-app Bot removed the needs backport to 3.12 only security fixes label Jan 18, 2025
picnixz added a commit that referenced this pull request Jan 18, 2025
…H-128752) (#128984)

gh-125997: suggest efficient alternatives for `time.sleep(0)` (GH-128752)
(cherry picked from commit f4afaa6)

Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
srinivasreddy pushed a commit to srinivasreddy/cpython that referenced this pull request Jan 21, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Documentation in the Doc dir skip news

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

6 participants