Preview Ruby 4.1 is a preview. It can change before the final release. Switch to Ruby 4.0 →
class method
Etc.nprocessors
() -> ::Integer
nprocessors → Integer
ext/etc/etc.c
View on GitHub ↗
static VALUE
etc_nprocessors(VALUE obj)
{
long ret;
#if !defined(_WIN32)
#if defined(HAVE_SCHED_GETAFFINITY) && defined(CPU_ALLOC)
int ncpus;
ncpus = etc_nprocessors_affin();
if (ncpus != -1) {
return INT2NUM(ncpus);
}
/* fallback to _SC_NPROCESSORS_ONLN */
#endif
errno = 0;
ret = sysconf(_SC_NPROCESSORS_ONLN);
if (ret == -1) {
rb_sys_fail("sysconf(_SC_NPROCESSORS_ONLN)");
}
#else
# ifndef ALL_PROCESSOR_GROUPS
# define ALL_PROCESSOR_GROUPS 0xffff
# endif
/* GetSystemInfo() counts the current processor group only, and mingw-w64 declares GetActiveProcessorCount() only for _WIN32_WINNT >= 0x0601 */
typedef DWORD (WINAPI *GetActiveProcessorCount_t)(WORD);
GetActiveProcessorCount_t pGetActiveProcessorCount =
(GetActiveProcessorCount_t)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "GetActiveProcessorCount");
DWORD n = 0;
if (pGetActiveProcessorCount) {
n = pGetActiveProcessorCount(ALL_PROCESSOR_GROUPS);
}
if (n == 0) {
SYSTEM_INFO si;
GetSystemInfo(&si);
n = si.dwNumberOfProcessors;
}
ret = (long)n;
#endif
return LONG2NUM(ret);
}
Returns the number of online processors.
The result is intended as the number of processes to use all available processors.
This method is implemented using:
-
sched_getaffinity(): Linux
-
sysconf(_SC_NPROCESSORS_ONLN): GNU/Linux, NetBSD, FreeBSD, OpenBSD, DragonFly BSD, OpenIndiana, Mac OS X, AIX
-
GetActiveProcessorCount(ALL_PROCESSOR_GROUPS): Windows
Example:
Example
require 'etc' p Etc.nprocessors #=> 4
The result might be smaller number than physical cpus especially when ruby process is bound to specific cpus. This is intended for getting better parallel processing.
Example: (Linux)
linux$ taskset 0x3 ./ruby -retc -e "p Etc.nprocessors" #=> 2