Yanıtlar:
> = 2.6 sürümüne sahip bir pitonunuz varsa,
import multiprocessing
multiprocessing.cpu_count()
http://docs.python.org/library/multiprocessing.html#multiprocessing.cpu_count
os.cpu_count()
Mevcut işleminizde kullanabileceğiniz işlemci sayısı ile ilgileniyorsanız , önce cpuset'i kontrol etmeniz gerekir . Aksi takdirde (veya cpuset kullanılmıyorsa), multiprocessing.cpu_count()
Python 2.6 ve daha yenisine gitmenin yoludur. Aşağıdaki yöntem, Python'un eski sürümlerinde birkaç alternatif yönteme geri döner:
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
sırasıyla ff, f ve f --- sırasıyla 8, 4 ve 4 (doğru) matematiğinizle. Ancak gerçek CPU sayısı sırasıyla 4, 2 ve 1'dir. "İşlemci" kelimesinin geçtiği yerlerin sayılmasının /proc/cpuinfo
daha iyi bir yol olabileceğini düşünüyorum. (Ya da sorum yanlış mı?)
/proc/cpuinfo
her "işlemci" için listelerden herhangi biri için "kardeşler" ile "cpu çekirdekleri" "Cpus_allowed" numaranızı alırsınız. Ve kardeşlerin hiper iş parçacığına atıfta bulunduklarını, dolayısıyla "sanal" referansınızı topladım. Ancak gerçek şu ki, "Cpus_allowed" numaranız MacPro'mda 8 iken, multiprocessing.cpu_count()
cevabınız 4'tür. Benim open('/proc/cpuinfo').read().count('processor')
de fiziksel çekirdekler (4 adet çift çekirdekli işlemci) sayısı olan 4 üretir.
open('/proc/self/status').read()
dosyayı kapatmayı unutur. with open('/proc/self/status') as f: f.read()
Bunun yerine kullanın
os.cpu_count()
with
İhtiyacınız olan bir durumla karşılaştığınızda kullanma alışkanlığına sahip olmak için hala iyi bir fikir .
Başka bir seçenek de psutil
, bu durumlarda her zaman yararlı olan kütüphaneyi kullanmaktır :
>>> import psutil
>>> psutil.cpu_count()
2
Bu, psutil
(Unix ve Windows) tarafından desteklenen tüm platformlarda çalışmalıdır .
Not Bazı durumlarda bu multiprocessing.cpu_count
bir zam olabilir NotImplementedError
süre psutil
CPU sayısını elde etmek mümkün olacaktır. Bunun nedeni, psutil
ilk olarak kullanılan tekniklerin aynısını kullanmaya çalışmaktır multiprocessing
ve eğer başarısız olursa başka teknikler de kullanır.
psutil.cpu_count(logical = True)
psutil.cpu_count()
12 (hiper iş parçacıklı 6 çekirdekli bir CPU) veriyor. Bunun nedeni, varsayılan bağımsız değişkeninin logical
True olması nedeniyle, psutil.cpu_count(logical = False)
fiziksel Çekirdeklerin sayısını almak için açıkça yazmanız gerekir .
Python 3.4+ sürümünde: os.cpu_count () .
multiprocessing.cpu_count()
Bu fonksiyon açısından uygulanan ancak yükseltir edilir NotImplementedError
eğer os.cpu_count()
döner None
( "CPU sayısını belirleyemiyor").
cpu_count
. len(os.sched_getaffinity(0))
amaca bağlı olarak daha iyi olabilir.
os.cpu_count()
OP'nin istediği) mevcut işlem için kullanılabilir CPU sayısından farklı olabilir ( os.sched_getaffinity(0)
).
os.sched_getaffinity(0)
bir değil kullanımı bu yüzden, BSD geçerli os.cpu_count()
(olduğunu, diğer dış kütüphaneye olmadan) gereklidir.
len(os.sched_getaffinity(0))
genellikle istediğin şey
https://docs.python.org/3/library/os.html#os.sched_getaffinity
os.sched_getaffinity(0)
(Python 3'e eklenmiştir), sched_setaffinity
Linux sistem çağrısı göz önüne alındığında mevcut bir işlemci setini döndürür .
0
mevcut işlem için değer elde etmek anlamına gelir. İşlev set()
, izin verilen CPU'lardan birini döndürür , bu nedenle buna ihtiyaç duyulur len()
.
multiprocessing.cpu_count()
Öte yandan, toplam fiziksel CPU sayısını döndürür.
Fark özellikle önemlidir çünkü Platform LSF gibi bazı küme yönetim sistemleri ile iş CPU kullanımını sınırlar sched_getaffinity
.
Bu nedenle, kullanırsanız multiprocessing.cpu_count()
, komut dosyanız kullanılabilir olandan daha fazla çekirdek kullanmaya çalışabilir ve bu da aşırı yüklenmeye ve zaman aşımlarına neden olabilir.
Farkı, taskset
fayda ile olan yakınlığı kısıtlayarak somut olarak görebiliriz .
Örneğin, Python'u 16 çekirdek sistemimde sadece 1 çekirdek (çekirdek 0) ile kısıtlarsam:
taskset -c 0 ./main.py
test komut dosyası ile:
main.py
#!/usr/bin/env python3
import multiprocessing
import os
print(multiprocessing.cpu_count())
print(len(os.sched_getaffinity(0)))
o zaman çıktı:
16
1
nproc
ancak, varsayılan olarak yakınlığa saygı duyar ve:
taskset -c 0 nproc
çıktılar:
1
ve man nproc
bunu açıkça ortaya koyuyor:
kullanılabilir işlem birimi sayısını yazdırın
nproc
vardır --all
Fiziksel CPU sayısı almak istiyorum daha az yaygın durum için bayrak:
taskset -c 0 nproc --all
Bu yöntemin tek dezavantajı, bunun yalnızca UNIX gibi görünmesidir. Windows'un benzer bir benzeşim API'sına sahip olması gerekiyordu SetProcessAffinityMask
, bu yüzden neden taşınmamış olduğunu merak ediyorum. Ama Windows hakkında hiçbir şey bilmiyorum.
Ubuntu 16.04, Python 3.5.2'de test edilmiştir.
platform bağımsız:
psutil.cpu_count (mantıksal = False)
psutil.cpu_count(logical=False) #4
psutil.cpu_count(logical=True) #8
vemultiprocessing.cpu_count() #8
Bunlar hiper iş parçacıklı CPU sayısını verir
multiprocessing.cpu_count()
os.cpu_count()
Bunlar size sanal makine CPU sayısını verir
psutil.cpu_count()
numexpr.detect_number_of_cores()
Yalnızca VM'lerde çalışıyorsanız önemlidir.
os.cpu_count()
ve multiprocessing.cpu_count()
hiper cpu sayısını değil, gerçek fiziksel işlemci sayısını döndürür.
multiprocessing.cpu_count()
mantıksal CPU sayısını döndürür, bu nedenle hiper iş parçacıklı dört çekirdekli bir CPU'nuz varsa, geri döner 8
. Fiziksel CPU sayısını istiyorsanız, hwloc için python bağlarını kullanın:
#!/usr/bin/env python
import hwloc
topology = hwloc.Topology()
topology.load()
print topology.get_nbobjs_by_type(hwloc.OBJ_CORE)
hwloc, işletim sistemleri ve mimariler arasında taşınabilir olacak şekilde tasarlanmıştır.
psutil.cpu_count(logical=False)
Kodu nasıl ekleyeceğinizi veya mesajı nasıl yanıtlayacağınızı anlayamıyorum, ancak vazgeçmeden önce takabileceğiniz jython desteği:
# jython
try:
from java.lang import Runtime
runtime = Runtime.getRuntime()
res = runtime.availableProcessors()
if res > 0:
return res
except ImportError:
pass
Bu amaçla "joblib" kullanabilirsiniz.
import joblib
print joblib.cpu_count()
Bu yöntem size sistemdeki cpus sayısını verecektir. joblib olsa kurulmalıdır. Joblib hakkında daha fazla bilgiyi burada bulabilirsiniz https://pythonhosted.org/joblib/parallel.html
Alternatif olarak, numexpr python paketini kullanabilirsiniz. Sistem cpu hakkında bilgi almak için yararlı birçok basit işlevi vardır.
import numexpr as ne
print ne.detect_number_of_cores()
/proc/<PID>/status
mevcut cpuset'teki CPU sayısını söyleyen bazı satırlara sahiptir: arayınCpus_allowed_list
.