5

WindowsXPとWindowsServer200864ビットの両方で動作するコードを作成しました。ただし、Amazon Windows 64ビットインスタンスを起動したばかりで、コードが失敗します。

とてもシンプルでこんな感じ

import multiprocessing

processors = multiprocessing.cpu_count()
print processors

理解できないNotImplementedErrorを受け取り、ドキュメントは説明にそれほど役立ちません。

Python 2.7の同じインストールで、あるサーバーで機能し、別のサーバーでは機能しない理由がわかりません。

他の誰かがこの問題/エラーに遭遇しますか?

4

3 に答える 3

4

それは単なるマルチプロセッシングモジュールである可能性があります。動作する可能性のあるpsutilモジュールを使用してみてください。したがって、あなたの場合は次のようにします。

import psutil
processors = psutil.cpu_count()
print processors
>>> 4

これをAmazonWindows64ビットで試しましたが、非常にうまく機能します。

于 2012-11-24T19:43:08.800 に答える
3

CPUカウントを取得するだけでよい場合は、代わりに次psutilを使用できます。ctypes

import ctypes
from ctypes import wintypes

class SYSTEM_INFO(ctypes.Structure):
    _fields_ = [
        ('wProcessorArchitecture', wintypes.WORD),
        ('wReserved', wintypes.WORD),
        ('dwPageSize', wintypes.DWORD),
        ('lpMinimumApplicationAddress', wintypes.LPVOID),
        ('lpMaximumApplicationAddress', wintypes.LPVOID),
        ('dwActiveProcessorMask', ctypes.c_size_t),
        ('dwNumberOfProcessors', wintypes.DWORD),
        ('dwProcessorType', wintypes.DWORD),
        ('dwAllocationGranularity', wintypes.DWORD),
        ('wProcessorLevel', wintypes.WORD),
        ('wProcessorRevision', wintypes.WORD),
    ]

GetSystemInfo = ctypes.windll.kernel32.GetSystemInfo
GetSystemInfo.restype = None
GetSystemInfo.argtypes = [ctypes.POINTER(SYSTEM_INFO)]

def cpu_count():
    sysinfo = SYSTEM_INFO()
    GetSystemInfo(sysinfo)
    num = sysinfo.dwNumberOfProcessors
    if num == 0:
        raise NotImplementedError('cannot determine number of cpus')
    return num

編集

NUMBER_OF_PROCESSORSこれは、環境変数と同じ値を返す可能性のある試行の代替手段です。ドキュメントにはGetSystemInfo代わりに使用するように記載されていることに注意してください。これはpsutilが使用するものです。これもネイティブNTAPIを使用していますが、これは一般的に推奨されていません。

import ctypes
from ctypes import wintypes

SystemBasicInformation = 0

class SYSTEM_INFORMATION(ctypes.Structure): pass
PSYSTEM_INFORMATION = ctypes.POINTER(SYSTEM_INFORMATION)

class SYSTEM_BASIC_INFORMATION(SYSTEM_INFORMATION):
    _fields_ = [
        ('Reserved1', wintypes.BYTE * 24),
        ('Reserved2', wintypes.LPVOID * 4),
        ('NumberOfProcessors', ctypes.c_ubyte),
    ]

ntdll = ctypes.windll.ntdll
NtQuerySystemInformation = ntdll.NtQuerySystemInformation
NtQuerySystemInformation.argtypes = [
    wintypes.LONG,       # SystemInformationClass
    PSYSTEM_INFORMATION, # SystemInformation
    wintypes.ULONG,      # SystemInformationLength
    wintypes.PULONG]     # ReturnLength

def cpu_count():
    info = SYSTEM_BASIC_INFORMATION()
    retlen = wintypes.ULONG()
    status = NtQuerySystemInformation(SystemBasicInformation,
                                      info, 
                                      ctypes.sizeof(info), 
                                      retlen)
    num = info.NumberOfProcessors
    if status < 0 or num == 0:
        raise NotImplementedError('cannot determine number of cpus')
    return num
于 2012-11-25T09:54:21.343 に答える
1

この失敗は、multiprocessing.cpu_count()がWindowsのNUMBER_OF_PROCESSORS環境変数に依存しているために発生しますが、これが欠落している場合があります。wmiを使用すると、代わりに機能します。eryksunの提案をありがとう。

if sys.platform == 'win32':
    import wmi
    c = wmi.WMI(find_classes=False)
    return sum(x.NumberOfLogicalProcessors for x in c.Win32_Processor())
else:
    return multiprocessing.cpu_count()
于 2014-06-25T13:29:42.383 に答える