eryksun added the comment:
> Well, we already expose CPU affinity:
>
> >>> import os
> >>> os.sched_getaffinity(0)
> {0}
os.sched_getaffinity only exists on some POSIX systems, such as Linux. For
Windows, here's a ctypes version of sched_getaffinity and sched_setaffinity:
import sys
from ctypes import *
from ctypes.wintypes import *
__all__ = ['sched_getaffinity', 'sched_setaffinity']
kernel32 = WinDLL('kernel32')
DWORD_PTR = WPARAM
PDWORD_PTR = POINTER(DWORD_PTR)
GetCurrentProcess = kernel32.GetCurrentProcess
GetCurrentProcess.restype = HANDLE
OpenProcess = kernel32.OpenProcess
OpenProcess.restype = HANDLE
OpenProcess.argtypes = (DWORD, # dwDesiredAccess,_In_
BOOL, # bInheritHandle,_In_
DWORD) # dwProcessId, _In_
GetProcessAffinityMask = kernel32.GetProcessAffinityMask
GetProcessAffinityMask.argtypes = (
HANDLE, # hProcess, _In_
PDWORD_PTR, # lpProcessAffinityMask, _Out_
PDWORD_PTR) # lpSystemAffinityMask, _Out_
SetProcessAffinityMask = kernel32.SetProcessAffinityMask
SetProcessAffinityMask.argtypes = (
HANDLE, # hProcess, _In_
DWORD_PTR) # dwProcessAffinityMask, _In_
PROCESS_SET_INFORMATION = 0x0200
PROCESS_QUERY_INFORMATION = 0x0400
PROCESS_QUERY_LIMITED_INFORMATION = 0x1000
if sys.getwindowsversion().major < 6:
PROCESS_QUERY_LIMITED_INFORMATION = PROCESS_QUERY_INFORMATION
def sched_getaffinity(pid):
if pid == 0:
hProcess = GetCurrentProcess()
else:
hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION,
False, pid)
if not hProcess:
raise WinError()
lpProcessAffinityMask = DWORD_PTR()
lpSystemAffinityMask = DWORD_PTR()
if not GetProcessAffinityMask(hProcess,
byref(lpProcessAffinityMask),
byref(lpSystemAffinityMask)):
raise WinError()
mask = lpProcessAffinityMask.value
return {c for c in range(sizeof(DWORD_PTR) * 8) if (1 << c) & mask}
def sched_setaffinity(pid, mask):
if pid == 0:
hProcess = GetCurrentProcess()
else:
hProcess = OpenProcess(PROCESS_SET_INFORMATION,
False, pid)
if not hProcess:
raise WinError()
bitmask = 0
for cpu in mask:
if not isinstance(cpu, int):
raise TypeError('expected an iterator of ints, but '
'iterator yielded %r' % type(cpu))
if cpu < 0:
raise ValueError('negative CPU number')
if cpu >= sizeof(DWORD_PTR) * 8:
raise ValueError('CPU number too large')
bitmask |= 1 << cpu
if not SetProcessAffinityMask(hProcess, bitmask):
raise WinError()
----------
nosy: +eryksun
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue23530>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com