win sleep refinements

This commit is contained in:
Will McGugan
2023-01-01 22:28:05 -08:00
parent 4cf3aeffa1
commit 31e066d488
2 changed files with 13 additions and 20 deletions

View File

@@ -2,8 +2,7 @@ import platform
import sys
from asyncio import sleep as asyncio_sleep, get_running_loop
from time import monotonic, perf_counter, sleep as time_sleep
from time import monotonic, perf_counter
PLATFORM = platform.system()
WINDOWS = PLATFORM == "Windows"
@@ -17,23 +16,10 @@ else:
if WINDOWS:
if sys.version_info >= (3, 11, 0):
from ._win_sleep import sleep as win_sleep
async def sleep(sleep_for: float) -> None:
"""An asyncio sleep.
On Windows this achieves a better granularity that asyncio.sleep
Args:
sleep_for (float): Seconds to sleep for.
"""
await get_running_loop().run_in_executor(None, time_sleep, sleep_for)
else:
from ._win_sleep import sleep as win_sleep
async def sleep(sleep_for: float) -> None:
await get_running_loop().run_in_executor(None, win_sleep, sleep_for)
async def sleep(sleep_for: float) -> None:
await get_running_loop().run_in_executor(None, win_sleep, sleep_for)
else:
sleep = asyncio_sleep

View File

@@ -2,6 +2,7 @@ import ctypes
from ctypes.wintypes import LARGE_INTEGER
from time import sleep as time_sleep
__all__ = ["sleep"]
kernel32 = ctypes.windll.kernel32
@@ -11,6 +12,7 @@ WAIT_FAILED = 0xFFFFFFFF
CREATE_WAITABLE_TIMER_HIGH_RESOLUTION = 0x00000002
def sleep(sleep_for: float) -> None:
"""A replacement sleep for Windows.
@@ -19,6 +21,13 @@ def sleep(sleep_for: float) -> None:
Args:
sleep_for (float): Seconds to sleep for.
"""
# Subtract a millisecond to account for overhead
sleep_for = max(0, sleep_for - 0.001)
if sleep_for < 0.0005:
# Less than 0.5ms and its not worth doing the sleep
return
handle = kernel32.CreateWaitableTimerExW(
None,
None,
@@ -29,7 +38,6 @@ def sleep(sleep_for: float) -> None:
time_sleep(sleep_for)
return
sleep_for -= 1 / 1000
if not kernel32.SetWaitableTimer(
handle,
ctypes.byref(LARGE_INTEGER(int(sleep_for * -10_000_000))),
@@ -39,7 +47,6 @@ def sleep(sleep_for: float) -> None:
0,
):
kernel32.CloseHandle(handle)
print("error")
time_sleep(sleep_for)
return