time.sleep 不适用于多线程
time.sleep does not work for multithreaded
当我发现 time.sleep()
没有挂起 运行 pywin32
模块的线程时,我试图对 code for "Suspend / Hibernate pc with python" provided by Ronan Paixão 进行多线程处理。
>>> 警告!以下代码将使 Windows 进入睡眠状态 <<<
def suspend(buffer, hibernate=False):
'''Puts Windows to Suspend/Sleep/Standby or Hibernate.
Parameters
----------
buffer: string, for time.sleep()
hibernate: bool, default False
If False (default), system will enter Suspend/Sleep/Standby state.
If True, system will Hibernate, but only if Hibernate is enabled in the
system settings. If it's not, system will Sleep.
Example:
--------
>>> suspend()
'''
print('before sleep')
sleep(float(buffer))
print('after sleep')
# Enable the SeShutdown privilege (which must be present in your
# token in the first place)
priv_flags = (win32security.TOKEN_ADJUST_PRIVILEGES |
win32security.TOKEN_QUERY)
hToken = win32security.OpenProcessToken(
win32api.GetCurrentProcess(),
priv_flags
)
priv_id = win32security.LookupPrivilegeValue(
None,
win32security.SE_SHUTDOWN_NAME
)
old_privs = win32security.AdjustTokenPrivileges(
hToken,
0,
[(priv_id, win32security.SE_PRIVILEGE_ENABLED)]
)
if (win32api.GetPwrCapabilities()['HiberFilePresent'] == False and
hibernate == True):
import warnings
warnings.warn("Hibernate isn't available. Suspending.")
try:
windll.powrprof.SetSuspendState(not hibernate, True, False)
except:
# True=> Standby; False=> Hibernate
# https://msdn.microsoft.com/pt-br/library/windows/desktop/aa373206(v=vs.85).aspx
# says the second parameter has no effect.
# ctypes.windll.kernel32.SetSystemPowerState(not hibernate, True)
win32api.SetSystemPowerState(not hibernate, True)
# Restore previous privileges
win32security.AdjustTokenPrivileges(
hToken,
0,
old_privs
)
if __name__ == '__main__':
Thread(target=suspend, args=("10")).start()
print
函数确实等待 time.sleep()
,但 Windows 立即进入休眠状态。
发生什么事了?
您在 Thread
的调用中错误地传递了缓冲区参数,因此它只 sleep
ing 了 1.0 秒。您需要在 args
关键字参数的值末尾添加逗号 ,
,如下所示:
.
.
if __name__ == '__main__':
Thread(target=suspend, args=("10",)).start()
当我发现 time.sleep()
没有挂起 运行 pywin32
模块的线程时,我试图对 code for "Suspend / Hibernate pc with python" provided by Ronan Paixão 进行多线程处理。
>>> 警告!以下代码将使 Windows 进入睡眠状态 <<<
def suspend(buffer, hibernate=False):
'''Puts Windows to Suspend/Sleep/Standby or Hibernate.
Parameters
----------
buffer: string, for time.sleep()
hibernate: bool, default False
If False (default), system will enter Suspend/Sleep/Standby state.
If True, system will Hibernate, but only if Hibernate is enabled in the
system settings. If it's not, system will Sleep.
Example:
--------
>>> suspend()
'''
print('before sleep')
sleep(float(buffer))
print('after sleep')
# Enable the SeShutdown privilege (which must be present in your
# token in the first place)
priv_flags = (win32security.TOKEN_ADJUST_PRIVILEGES |
win32security.TOKEN_QUERY)
hToken = win32security.OpenProcessToken(
win32api.GetCurrentProcess(),
priv_flags
)
priv_id = win32security.LookupPrivilegeValue(
None,
win32security.SE_SHUTDOWN_NAME
)
old_privs = win32security.AdjustTokenPrivileges(
hToken,
0,
[(priv_id, win32security.SE_PRIVILEGE_ENABLED)]
)
if (win32api.GetPwrCapabilities()['HiberFilePresent'] == False and
hibernate == True):
import warnings
warnings.warn("Hibernate isn't available. Suspending.")
try:
windll.powrprof.SetSuspendState(not hibernate, True, False)
except:
# True=> Standby; False=> Hibernate
# https://msdn.microsoft.com/pt-br/library/windows/desktop/aa373206(v=vs.85).aspx
# says the second parameter has no effect.
# ctypes.windll.kernel32.SetSystemPowerState(not hibernate, True)
win32api.SetSystemPowerState(not hibernate, True)
# Restore previous privileges
win32security.AdjustTokenPrivileges(
hToken,
0,
old_privs
)
if __name__ == '__main__':
Thread(target=suspend, args=("10")).start()
print
函数确实等待 time.sleep()
,但 Windows 立即进入休眠状态。
发生什么事了?
您在 Thread
的调用中错误地传递了缓冲区参数,因此它只 sleep
ing 了 1.0 秒。您需要在 args
关键字参数的值末尾添加逗号 ,
,如下所示:
.
.
if __name__ == '__main__':
Thread(target=suspend, args=("10",)).start()