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 <rep...@bugs.python.org> <http://bugs.python.org/issue23530> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com