簡體   English   中英

time.sleep 不適用於多線程

[英]time.sleep does not work for multithreaded

當我發現time.sleep()沒有掛起運行pywin32模塊的線程時,我試圖對Ronan Paixão提供的“Suspend / Hibernate pc with python”代碼進行多線程處理。

>>> 警告! 以下代碼將使 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 1.0 秒。 您需要在args關鍵字參數的值末尾添加一個逗號,如下所示:

.
.
if __name__ == '__main__':
    Thread(target=suspend, args=("10",)).start()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM