উত্তর:
আপনার কাছে সংস্করণ> = 2.6 সহ অজগর থাকলে আপনি সহজেই ব্যবহার করতে পারেন
import multiprocessing
multiprocessing.cpu_count()
http://docs.python.org/library/multiprocessing.html#multiprocessing.cpu_count
os.cpu_count()
আপনি যদি আপনার বর্তমান প্রক্রিয়াটিতে উপলব্ধ প্রসেসরের সংখ্যার প্রতি আগ্রহী হন , আপনাকে প্রথমে সিপুয়েসেট পরীক্ষা করতে হবে । অন্যথায় (বা সিপুসেট ব্যবহার না হলে), multiprocessing.cpu_count()
পাইথন ২.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
যদি প্রতিটি "প্রসেসর" এর তালিকার কোনও একটির জন্য আপনি "ভাই-বোন" "সিপিইউ কোর" দ্বারা গুণান আপনি আপনার "সিপাস_নীলিত" নম্বর পাবেন। এবং আমি জড়ো করেছি যে ভাইবোনরা হাইপার-থ্রেডিংয়ের বিষয়ে উল্লেখ করে, সুতরাং আপনার "ভার্চুয়াল" এর জন্য উল্লেখ। তবে সত্যটি এখনও অব্যাহত রয়েছে যে আপনার "সিপাস_নীলিত" নম্বরটি আমার ম্যাকপ্রোতে 8 টি রয়েছে যদিও আপনার multiprocessing.cpu_count()
উত্তর 4 My আমার নিজেরও 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
পারে সিপিইউগুলির সংখ্যা অর্জন করতে সক্ষম। এটি কেবল কারণ এটির জন্য psutil
প্রথম ব্যবহৃত কৌশলগুলি ব্যবহার করার চেষ্টা করে multiprocessing
এবং যদি এটি ব্যর্থ হয় তবে এটি অন্যান্য কৌশলও ব্যবহার করে।
psutil.cpu_count(logical = True)
psutil.cpu_count()
12 দেয় (এটি হাইপারথ্রেডিং সহ একটি 6-কোর সিপিইউ)। এটির কারণ হ'ল ডিফল্ট যুক্তিটি logical
সত্য, সুতরাং psutil.cpu_count(logical = False)
শারীরিক কোরের সংখ্যা পেতে আপনাকে স্পষ্টতই লিখতে হবে।
পাইথনে ৩.৪++: 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
ইউটিলিটির সাথে সখ্যতা সীমাবদ্ধ করে আমরা পার্থক্যটি দৃ concrete়তার সাথে দেখতে পারি ।
উদাহরণস্বরূপ, যদি আমি আমার 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
এই পদ্ধতির একমাত্র নেতিবাচকতা এটি কেবল ইউনিক্স হিসাবে উপস্থিত হয়। আমার ধারণা ছিল উইন্ডোজের অবশ্যই একটি অনুরূপ অ্যাফিনিটি এপিআই থাকতে হবে SetProcessAffinityMask
, তাই কেন আমি এটি পোর্ট করা হয়নি তা অবাক করি। তবে আমি উইন্ডোজ সম্পর্কে কিছুই জানি না।
উবুন্টু 16.04, পাইথন 3.5.3।
স্বাধীন প্ল্যাটফর্ম:
psutil.cpu_count (লজিক্যাল = মিথ্যা)
psutil.cpu_count(logical=False) #4
psutil.cpu_count(logical=True) #8
এবংmultiprocessing.cpu_count() #8
এগুলি আপনাকে হাইপারথ্রেডেড সিপিইউ গণনা দেয়
multiprocessing.cpu_count()
os.cpu_count()
এগুলি আপনাকে ভার্চুয়াল মেশিনের সিপিইউ গণনা দেয়
psutil.cpu_count()
numexpr.detect_number_of_cores()
আপনি যদি ভিএমগুলিতে কাজ করেন তবেই তা গুরুত্বপূর্ণ।
os.cpu_count()
এবং multiprocessing.cpu_count()
হাইপারথ্রেডেড সিপিইউ গণনাগুলি ফিরিয়ে দেবে, প্রকৃত শারীরিক সিপু গণনা নয়।
multiprocessing.cpu_count()
লজিক্যাল সিপিইউগুলির সংখ্যা ফিরিয়ে দেবে, সুতরাং আপনার যদি হাইপারথ্রেডিং সহ কোয়াড-কোর সিপিইউ থাকে তবে এটি ফিরে আসবে 8
। আপনি যদি শারীরিক সিপিইউগুলির সংখ্যা চান তবে hwloc এ পাইথন বাইন্ডিং ব্যবহার করুন:
#!/usr/bin/env python
import hwloc
topology = hwloc.Topology()
topology.load()
print topology.get_nbobjs_by_type(hwloc.OBJ_CORE)
hwloc ওএস এবং আর্কিটেকচার জুড়ে পোর্টেবল হতে ডিজাইন করা হয়েছে।
psutil.cpu_count(logical=False)
কোডটিতে কীভাবে যুক্ত করা বা বার্তার উত্তর দেওয়া যায় তা অনুমান করতে পারছি না তবে এখানে জাইথনের পক্ষে সমর্থন যা আপনি হাল ছেড়ে দেওয়ার আগে এটিকে মোকাবেলা করতে পারেন:
# 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()
এই পদ্ধতিটি আপনাকে সিস্টেমে সিপাসের নম্বর দেবে। জবলিব যদিও ইনস্টল করা প্রয়োজন। জবলিব সম্পর্কিত আরও তথ্য এখানে পাওয়া যাবে https://pythonhosted.org/joblib/parallel.html
বিকল্পভাবে আপনি পাইথনের numexpr প্যাকেজটি ব্যবহার করতে পারেন। এটি সিস্টেম সিপিইউ সম্পর্কিত তথ্য পাওয়ার জন্য অনেকগুলি সহজ কার্যকারিতা রয়েছে।
import numexpr as ne
print ne.detect_number_of_cores()
আপনার কাছে পাইথন ২.6 না থাকলে অন্য একটি বিকল্প:
import commands
n = commands.getoutput("grep -c processor /proc/cpuinfo")
/proc/<PID>/status
কিছু লাইন রয়েছে যা আপনাকে বর্তমান সিপুজেটে সিপিইউ সংখ্যা বলে: দেখুনCpus_allowed_list
।