जवाबों:
यदि आपके पास एक संस्करण> = 2.6 के साथ अजगर है तो आप बस उपयोग कर सकते हैं
import multiprocessing
multiprocessing.cpu_count()
http://docs.python.org/library/multiprocessing.html#multiprocessing.cpu_count
os.cpu_count()
यदि आप अपनी वर्तमान प्रक्रिया के लिए उपलब्ध प्रोसेसर की संख्या में रुचि रखते हैं , तो आपको पहले cpuset को जांचना होगा । अन्यथा (या अगर cpuset उपयोग में नहीं है), multiprocessing.cpu_count()
Python 2.6 और नए में जाने का तरीका है। निम्नलिखित विधि अजगर के पुराने संस्करणों में वैकल्पिक तरीकों के एक जोड़े के लिए वापस आती है:
import os
import re
import subprocess
def available_cpu_count():
""" Number of available virtual or physical CPUs on this system, i.e.
user/real as output by time(1) when called with an optimally scaling
userspace-only program"""
# cpuset
# cpuset may restrict the number of *available* processors
try:
m = re.search(r'(?m)^Cpus_allowed:\s*(.*)$',
open('/proc/self/status').read())
if m:
res = bin(int(m.group(1).replace(',', ''), 16)).count('1')
if res > 0:
return res
except IOError:
pass
# Python 2.6+
try:
import multiprocessing
return multiprocessing.cpu_count()
except (ImportError, NotImplementedError):
pass
# https://github.com/giampaolo/psutil
try:
import psutil
return psutil.cpu_count() # psutil.NUM_CPUS on old versions
except (ImportError, AttributeError):
pass
# POSIX
try:
res = int(os.sysconf('SC_NPROCESSORS_ONLN'))
if res > 0:
return res
except (AttributeError, ValueError):
pass
# Windows
try:
res = int(os.environ['NUMBER_OF_PROCESSORS'])
if res > 0:
return res
except (KeyError, ValueError):
pass
# jython
try:
from java.lang import Runtime
runtime = Runtime.getRuntime()
res = runtime.availableProcessors()
if res > 0:
return res
except ImportError:
pass
# BSD
try:
sysctl = subprocess.Popen(['sysctl', '-n', 'hw.ncpu'],
stdout=subprocess.PIPE)
scStdout = sysctl.communicate()[0]
res = int(scStdout)
if res > 0:
return res
except (OSError, ValueError):
pass
# Linux
try:
res = open('/proc/cpuinfo').read().count('processor\t:')
if res > 0:
return res
except IOError:
pass
# Solaris
try:
pseudoDevices = os.listdir('/devices/pseudo/')
res = 0
for pd in pseudoDevices:
if re.match(r'^cpuid@[0-9]+$', pd):
res += 1
if res > 0:
return res
except OSError:
pass
# Other UNIXes (heuristic)
try:
try:
dmesg = open('/var/run/dmesg.boot').read()
except IOError:
dmesgProcess = subprocess.Popen(['dmesg'], stdout=subprocess.PIPE)
dmesg = dmesgProcess.communicate()[0]
res = 0
while '\ncpu' + str(res) + ':' in dmesg:
res += 1
if res > 0:
return res
except OSError:
pass
raise Exception('Can not determine number of CPUs on this system')
/proc/self/status
क्रमशः ff, f और f --- हैं जो 8, 4 के अनुरूप है। 4 आपके (सही) गणित द्वारा। हालाँकि सीपीयू की वास्तविक संख्या क्रमशः 4, 2 और 1. है। मुझे लगता है कि "प्रोसेसर" शब्द की संख्या की गिनती /proc/cpuinfo
करना बेहतर तरीका हो सकता है। (या क्या मेरा प्रश्न गलत है?)
/proc/cpuinfo
कि यदि किसी भी "प्रोसेसर" के लिए किसी एक लिस्टिंग के लिए आप "भाई-बहनों" को "सीपीयू कोर" से गुणा करें। आपको अपना "Cpus_allowed" नंबर मिलता है। और मैं इकट्ठा करता हूं कि भाई-बहन हाइपर-थ्रेडिंग का संदर्भ देते हैं, इसलिए आपका "वर्चुअल" संदर्भ है। लेकिन तथ्य यह है कि आपका "Cpus_allowed" नंबर मेरे MacPro पर 8 है जबकि आपका multiprocessing.cpu_count()
उत्तर 4 है। मेरा खुद का open('/proc/cpuinfo').read().count('processor')
भी 4, भौतिक कोर की संख्या (दो दोहरे कोर प्रोसेसर) है।
open('/proc/self/status').read()
फ़ाइल बंद करना भूल जाता है। with open('/proc/self/status') as f: f.read()
इसके बजाय का उपयोग करें
os.cpu_count()
with
जब आप किसी ऐसे मामले का सामना करते हैं, जहां आपको इसकी आवश्यकता होती है, तब उपयोग करने की आदत होती है।
एक अन्य विकल्प psutil
पुस्तकालय का उपयोग करना है, जो हमेशा इन स्थितियों में उपयोगी होता है:
>>> import psutil
>>> psutil.cpu_count()
2
यह psutil
(यूनिक्स और विंडोज) द्वारा समर्थित किसी भी मंच पर काम करना चाहिए ।
ध्यान दें कि कुछ अवसरों में multiprocessing.cpu_count
एक उठा सकती है NotImplementedError
, जबकि psutil
CPU की संख्या प्राप्त करने में सक्षम हो जाएगा। यह केवल इसलिए है क्योंकि psutil
पहले उसी तकनीक का उपयोग करने की कोशिश करता है multiprocessing
और यदि वे विफल होते हैं, तो यह अन्य तकनीकों का भी उपयोग करता है।
psutil.cpu_count(logical = True)
psutil.cpu_count()
12 देता है (यह हाइपरथ्रेडिंग वाला 6-कोर सीपीयू है)। इसका कारण यह है कि डिफ़ॉल्ट तर्क logical
सत्य है, इसलिए आपको psutil.cpu_count(logical = False)
भौतिक कोर की संख्या प्राप्त करने के लिए स्पष्ट रूप से लिखने की आवश्यकता है ।
पायथन में 3.4+ : os.cpu_count () ।
multiprocessing.cpu_count()
इस फ़ंक्शन के संदर्भ में कार्यान्वित किया जाता है लेकिन NotImplementedError
अगर os.cpu_count()
रिटर्न None
("सीपीयू की संख्या निर्धारित नहीं कर सकता है")।
cpu_count
। len(os.sched_getaffinity(0))
उद्देश्य के आधार पर बेहतर हो सकता है।
os.cpu_count()
-ओपी ओपी पूछती है) वर्तमान प्रक्रिया ( os.sched_getaffinity(0)
) के लिए उपलब्ध सीपीयू की संख्या से भिन्न हो सकती है ।
os.sched_getaffinity(0)
है नहीं बीएसडी पर उपलब्ध इसलिए का उपयोग, os.cpu_count()
आवश्यक है (अन्य बाहरी पुस्तकालय के बिना यह है कि,)।
len(os.sched_getaffinity(0))
वह है जो आप आमतौर पर चाहते हैं
https://docs.python.org/3/library/os.html#os.sched_getaffinity
os.sched_getaffinity(0)
(पायथन 3 में जोड़ा गया) sched_setaffinity
लिनक्स सिस्टम कॉल को देखते हुए उपलब्ध सीपीयू का सेट लौटाता है , जो सीपीयू की एक प्रक्रिया को सीमित करता है और इसके बच्चे चल सकते हैं।
0
वर्तमान प्रक्रिया के लिए मूल्य प्राप्त करने का मतलब है। फ़ंक्शन एक set()
अनुमत सीपीयू देता है, इस प्रकार इसकी आवश्यकता है len()
।
multiprocessing.cpu_count()
दूसरी ओर सिर्फ भौतिक सीपीयू की कुल संख्या लौटाता है।
यह अंतर विशेष रूप से महत्वपूर्ण है क्योंकि कुछ निश्चित प्रबंधन प्रणालियां जैसे कि प्लेटफ़ॉर्म एलएसएफ, नौकरी सीपीयू उपयोग के साथ सीमित है sched_getaffinity
।
इसलिए, यदि आप उपयोग करते हैं multiprocessing.cpu_count()
, तो आपकी स्क्रिप्ट उपलब्ध होने की तुलना में अधिक कोर का उपयोग करने का प्रयास कर सकती है, जिससे ओवरलोड और टाइमआउट हो सकता है।
taskset
उपयोगिता के साथ आत्मीयता को सीमित करके हम अंतर को स्पष्ट रूप से देख सकते हैं ।
उदाहरण के लिए, यदि मैं अपने 16 कोर सिस्टम में पायथन को सिर्फ 1 कोर (कोर 0) तक सीमित करता हूं:
taskset -c 0 ./main.py
परीक्षण स्क्रिप्ट के साथ:
main.py
#!/usr/bin/env python3
import multiprocessing
import os
print(multiprocessing.cpu_count())
print(len(os.sched_getaffinity(0)))
फिर आउटपुट है:
16
1
nproc
हालाँकि, डिफ़ॉल्ट रूप से आत्मीयता का सम्मान करता है और:
taskset -c 0 nproc
आउटपुट:
1
और man nproc
यह काफी स्पष्ट करता है:
उपलब्ध प्रसंस्करण इकाइयों की संख्या प्रिंट करें
nproc
है --all
कम आम मामला है कि आप शारीरिक सीपीयू गिनती प्राप्त करना चाहते हैं के लिए झंडा:
taskset -c 0 nproc --all
इस पद्धति का एकमात्र नकारात्मक पहलू यह है कि यह केवल UNIX प्रतीत होता है। मुझे लगता है कि विंडोज में संभवतः समान समानता वाला एपीआई होना चाहिए SetProcessAffinityMask
, इसलिए मुझे आश्चर्य है कि इसे पोर्ट क्यों नहीं किया गया है। लेकिन मुझे विंडोज के बारे में कुछ नहीं पता है।
उबंटू 16.04, पायथन 3.5.2 में परीक्षण किया गया।
स्वतंत्र मंच:
psutil.cpu_count (तार्किक = false)
psutil.cpu_count(logical=False) #4
psutil.cpu_count(logical=True) #8
औरmultiprocessing.cpu_count() #8
ये आपको हाइपरथ्रेडेड सीपीयू काउंट देते हैं
multiprocessing.cpu_count()
os.cpu_count()
ये आपको वर्चुअल मशीन CPU काउंट प्रदान करते हैं
psutil.cpu_count()
numexpr.detect_number_of_cores()
केवल तब ही मायने रखता है जब आप VMs पर काम करते हैं।
os.cpu_count()
और multiprocessing.cpu_count()
हाइपरथ्रेडेड सीपीयू काउंट्स को लौटाएगा, वास्तविक भौतिक सीपीयू काउंट को नहीं।
multiprocessing.cpu_count()
तार्किक CPU की संख्या लौटाएगा, इसलिए यदि आपके पास हाइपरथ्रेडिंग वाला क्वाड-कोर CPU है, तो यह वापस आ जाएगा 8
। यदि आप भौतिक CPU की संख्या चाहते हैं, तो hwloc के लिए अजगर बाइंडिंग का उपयोग करें:
#!/usr/bin/env python
import hwloc
topology = hwloc.Topology()
topology.load()
print topology.get_nbobjs_by_type(hwloc.OBJ_CORE)
hwloc को OSes और आर्किटेक्चर के पार पोर्टेबल बनाया गया है।
psutil.cpu_count(logical=False)
कोड को जोड़ने या संदेश का जवाब देने के लिए पता नहीं लगा सकते हैं, लेकिन यहां इस बात का समर्थन है कि आप इससे पहले कि आप इसे उठा सकते हैं, jython का समर्थन:
# jython
try:
from java.lang import Runtime
runtime = Runtime.getRuntime()
res = runtime.availableProcessors()
if res > 0:
return res
except ImportError:
pass
आप इस उद्देश्य के लिए "जॉबलिब" का भी उपयोग कर सकते हैं।
import joblib
print joblib.cpu_count()
यह विधि आपको सिस्टम में cpus की संख्या देगी। जॉबलिब को हालांकि स्थापित करने की आवश्यकता है। जॉबलिब के बारे में अधिक जानकारी https://pythonhosted.org/joblib/parallel.html पर देखी जा सकती है
वैकल्पिक रूप से आप अजगर के सुन्न पैकेज का उपयोग कर सकते हैं। सिस्टम सीपीयू के बारे में जानकारी प्राप्त करने के लिए इसमें बहुत सारे सरल कार्य सहायक हैं।
import numexpr as ne
print ne.detect_number_of_cores()
एक और विकल्प यदि आपके पास पाइथन 2.6 नहीं है:
import commands
n = commands.getoutput("grep -c processor /proc/cpuinfo")
/proc/<PID>/status
कुछ पंक्तियाँ हैं जो आपको वर्तमान सीपीयू में सीपीयू की संख्या बताती हैं: तलाश करेंCpus_allowed_list
।