-
-
Notifications
You must be signed in to change notification settings - Fork 30.9k
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
gh-125997: suggest efficient alternatives for time.sleep(0)
#128752
base: main
Are you sure you want to change the base?
Conversation
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.
@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. |
i think it's interesting that 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). |
Actually,
While it's mentioned like that, I think it's wrong in the first place to rely on 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, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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
)
.. note:: | ||
|
||
For polling, consider using :meth:`select.poll.poll(0) <select.poll.poll>` | ||
instead of ``time.sleep(0)``. To emulate a "no-op", use :keyword:`pass`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think that it's the right place to mention polling file descriptors in time.sleep() documentation.
For polling, consider using :meth:`select.poll.poll(0) <select.poll.poll>` | ||
instead of ``time.sleep(0)``. To emulate a "no-op", use :keyword:`pass`. | ||
|
||
To voluntarily relinquish the CPU, specify a read-time :ref:`scheduling |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
read-time?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To voluntarily relinquish the CPU, specify a read-time :ref:`scheduling | |
To voluntarily relinquish the CPU, specify a real-time :ref:`scheduling |
Probably meant real time
After a discussion with Victor and because #128274 is not convincing enough, we decide to:
time.sleep()
, andtime.sleep(0)
.See #125997 (comment) for more details.
time.sleep(0)
is slower on Python 3.11 than on Python 3.10 #125997📚 Documentation preview 📚: https://cpython-previews--128752.org.readthedocs.build/