pub struct RiDeviceScheduler { /* private fields */ }Expand description
§Device Scheduler
This file implements a comprehensive device scheduler for Ri, responsible for:
- Managing device resource allocation and scheduling
- Implementing multiple scheduling algorithms
- Recording allocation history and statistics
- Providing scheduling recommendations based on historical data
§Design Principles
- Multiple Scheduling Algorithms: Supports FirstFit, BestFit, WorstFit, RoundRobin, PriorityBased, and LoadBalanced policies
- Policy Per Device Type: Different device types can have different scheduling policies
- Allocation History: Maintains detailed records of all allocations
- Statistics and Recommendations: Provides insights into scheduling effectiveness and recommendations for optimization
- Resource Pool Integration: Works closely with the resource pool manager
- Thread Safety: Uses Arc and Mutex for thread-safe operations
- Scalability: Designed to handle large numbers of devices and allocations
§Usage Examples
use ri::device::{RiDeviceScheduler, RiAllocationRequest, RiDeviceType, RiDeviceCapabilities};
use ri::device::pool::RiResourcePoolManager;
use std::sync::{Arc, Mutex};
fn example() {
// Create resource pool manager
let pool_manager = Arc::new(Mutex::new(RiResourcePoolManager::new()));
// Create device scheduler
let mut scheduler = RiDeviceScheduler::new(pool_manager);
// Set scheduling policy for GPUs
scheduler.set_policy(RiDeviceType::GPU, ri::device::RiSchedulingPolicy::PriorityBased);
// Create allocation request
let request = RiAllocationRequest {
device_type: RiDeviceType::GPU,
capabilities: RiDeviceCapabilities {
memory_gb: Some(16.0),
compute_units: Some(512),
storage_gb: None,
bandwidth_gbps: None,
custom_capabilities: HashMap::new(),
},
priority: 5,
timeout_secs: 30,
};
// Allocate device
if let Some(allocation_id) = scheduler.allocate(&request) {
println!("Allocated device with ID: {}", allocation_id);
// Record release when done
scheduler.record_release(&allocation_id);
}
// Get statistics
let stats = scheduler.get_statistics();
println!("Total allocations: {}", stats.total_allocations);
}Device scheduler - manages device resource allocation and scheduling
This struct implements a comprehensive device scheduling system that manages resource allocation using various scheduling algorithms. It works closely with the resource pool manager to access available devices and implements multiple scheduling policies per device type.
Implementations§
Source§impl RiDeviceScheduler
impl RiDeviceScheduler
Sourcepub fn new(resource_pool_manager: Arc<RwLock<RiResourcePoolManager>>) -> Self
pub fn new(resource_pool_manager: Arc<RwLock<RiResourcePoolManager>>) -> Self
Create a new device scheduler with default policies and empty allocation history.
This method initializes the scheduler with default scheduling policies for each device type and connects it to the provided resource pool manager.
§Parameters
resource_pool_manager: Resource pool manager for accessing available devices
§Returns
A new RiDeviceScheduler instance with default policies and settings.
Sourcepub fn get_policy(&self, device_type: &RiDeviceType) -> &RiSchedulingPolicy
pub fn get_policy(&self, device_type: &RiDeviceType) -> &RiSchedulingPolicy
Get the scheduling policy for a specific device type.
This method returns the scheduling policy configured for the specified device type. If no policy is configured, it returns the default FirstFit policy.
§Parameters
device_type: Device type to get the policy for
§Returns
A reference to the RiSchedulingPolicy for the specified device type.
Sourcepub fn set_policy(
&mut self,
device_type: RiDeviceType,
policy: RiSchedulingPolicy,
)
pub fn set_policy( &mut self, device_type: RiDeviceType, policy: RiSchedulingPolicy, )
Set the scheduling policy for a specific device type.
This method configures the scheduling policy for the specified device type.
§Parameters
device_type: Device type to set the policy forpolicy: Scheduling policy to use for this device type
Sourcepub async fn select_device(
&self,
request: &RiAllocationRequest,
) -> Option<Arc<RiDevice>>
pub async fn select_device( &self, request: &RiAllocationRequest, ) -> Option<Arc<RiDevice>>
Select a device based on the scheduling policy for the requested device type.
This method selects the best device for the allocation request by:
- Getting the appropriate scheduling policy for the device type
- Collecting available devices from the resource pool manager
- Filtering devices that meet the requirements
- Applying the scheduling policy to select the best device
§Parameters
request: Allocation request with device type, capabilities, priority, and timeout
§Returns
An Arc<RiDevice> if a suitable device was found, or None if no device meets the requirements.
Sourcepub async fn allocate(&self, request: &RiAllocationRequest) -> Option<String>
pub async fn allocate(&self, request: &RiAllocationRequest) -> Option<String>
Allocate a device based on the scheduling policy.
This method selects a device using the appropriate scheduling policy and records the allocation.
§Parameters
request: Allocation request with device type, capabilities, priority, and timeout
§Returns
An allocation ID if successful, or None if no suitable device was found.
Sourcepub async fn record_allocation(
&self,
allocation_id: String,
device_id: String,
device_type: RiDeviceType,
capabilities_required: RiDeviceCapabilities,
)
pub async fn record_allocation( &self, allocation_id: String, device_id: String, device_type: RiDeviceType, capabilities_required: RiDeviceCapabilities, )
Record an allocation in the history.
This method records a new allocation in the history, including device information, capabilities required, and allocation time.
§Parameters
allocation_id: Unique allocation identifierdevice_id: ID of the allocated devicedevice_type: Type of the allocated devicecapabilities_required: Capabilities required for this allocation
Sourcepub async fn record_release(&self, allocation_id: &str)
pub async fn record_release(&self, allocation_id: &str)
Record the release of an allocation.
This method updates an allocation record to mark it as released, including the release time and duration of the allocation.
§Parameters
allocation_id: ID of the allocation to release
Sourcepub async fn get_statistics(&self) -> RiAllocationStatistics
pub async fn get_statistics(&self) -> RiAllocationStatistics
Get allocation statistics and metrics.
This method calculates comprehensive statistics about allocations, including:
- Total and successful allocations
- Success rate
- Average allocation duration
- Statistics by device type
§Returns
A RiAllocationStatistics struct containing comprehensive allocation statistics.
Sourcepub async fn get_recommendations(
&self,
device_type: &RiDeviceType,
) -> Vec<RiSchedulingRecommendation>
pub async fn get_recommendations( &self, device_type: &RiDeviceType, ) -> Vec<RiSchedulingRecommendation>
Get scheduling recommendations based on historical data.
Trait Implementations§
Source§impl<'py> IntoPyObject<'py> for RiDeviceScheduler
impl<'py> IntoPyObject<'py> for RiDeviceScheduler
Source§type Target = RiDeviceScheduler
type Target = RiDeviceScheduler
Source§type Output = Bound<'py, <RiDeviceScheduler as IntoPyObject<'py>>::Target>
type Output = Bound<'py, <RiDeviceScheduler as IntoPyObject<'py>>::Target>
Source§fn into_pyobject(
self,
py: Python<'py>,
) -> Result<<Self as IntoPyObject<'_>>::Output, <Self as IntoPyObject<'_>>::Error>
fn into_pyobject( self, py: Python<'py>, ) -> Result<<Self as IntoPyObject<'_>>::Output, <Self as IntoPyObject<'_>>::Error>
Source§impl PyClass for RiDeviceScheduler
impl PyClass for RiDeviceScheduler
Source§impl PyClassImpl for RiDeviceScheduler
impl PyClassImpl for RiDeviceScheduler
Source§const IS_BASETYPE: bool = false
const IS_BASETYPE: bool = false
Source§const IS_SUBCLASS: bool = false
const IS_SUBCLASS: bool = false
Source§const IS_MAPPING: bool = false
const IS_MAPPING: bool = false
Source§const IS_SEQUENCE: bool = false
const IS_SEQUENCE: bool = false
Source§const IS_IMMUTABLE_TYPE: bool = false
const IS_IMMUTABLE_TYPE: bool = false
Source§const RAW_DOC: &'static CStr = c"# Device Scheduler\n\nThis file implements a comprehensive device scheduler for Ri, responsible for:\n1. Managing device resource allocation and scheduling\n2. Implementing multiple scheduling algorithms\n3. Recording allocation history and statistics\n4. Providing scheduling recommendations based on historical data\n\n## Design Principles\n\n1. **Multiple Scheduling Algorithms**: Supports FirstFit, BestFit, WorstFit, RoundRobin, PriorityBased, and LoadBalanced policies\n2. **Policy Per Device Type**: Different device types can have different scheduling policies\n3. **Allocation History**: Maintains detailed records of all allocations\n4. **Statistics and Recommendations**: Provides insights into scheduling effectiveness and recommendations for optimization\n5. **Resource Pool Integration**: Works closely with the resource pool manager\n6. **Thread Safety**: Uses Arc and Mutex for thread-safe operations\n7. **Scalability**: Designed to handle large numbers of devices and allocations\n\n## Usage Examples\n\n```rust\nuse ri::device::{RiDeviceScheduler, RiAllocationRequest, RiDeviceType, RiDeviceCapabilities};\nuse ri::device::pool::RiResourcePoolManager;\nuse std::sync::{Arc, Mutex};\n\nfn example() {\n // Create resource pool manager\n let pool_manager = Arc::new(Mutex::new(RiResourcePoolManager::new()));\n \n // Create device scheduler\n let mut scheduler = RiDeviceScheduler::new(pool_manager);\n \n // Set scheduling policy for GPUs\n scheduler.set_policy(RiDeviceType::GPU, ri::device::RiSchedulingPolicy::PriorityBased);\n \n // Create allocation request\n let request = RiAllocationRequest {\n device_type: RiDeviceType::GPU,\n capabilities: RiDeviceCapabilities {\n memory_gb: Some(16.0),\n compute_units: Some(512),\n storage_gb: None,\n bandwidth_gbps: None,\n custom_capabilities: HashMap::new(),\n },\n priority: 5,\n timeout_secs: 30,\n };\n \n // Allocate device\n if let Some(allocation_id) = scheduler.allocate(&request) {\n println!(\"Allocated device with ID: {}\", allocation_id);\n \n // Record release when done\n scheduler.record_release(&allocation_id);\n }\n \n // Get statistics\n let stats = scheduler.get_statistics();\n println!(\"Total allocations: {}\", stats.total_allocations);\n}\n```\nDevice scheduler - manages device resource allocation and scheduling\n\nThis struct implements a comprehensive device scheduling system that manages\nresource allocation using various scheduling algorithms. It works closely with\nthe resource pool manager to access available devices and implements multiple\nscheduling policies per device type.\x00"
const RAW_DOC: &'static CStr = c"# Device Scheduler\n\nThis file implements a comprehensive device scheduler for Ri, responsible for:\n1. Managing device resource allocation and scheduling\n2. Implementing multiple scheduling algorithms\n3. Recording allocation history and statistics\n4. Providing scheduling recommendations based on historical data\n\n## Design Principles\n\n1. **Multiple Scheduling Algorithms**: Supports FirstFit, BestFit, WorstFit, RoundRobin, PriorityBased, and LoadBalanced policies\n2. **Policy Per Device Type**: Different device types can have different scheduling policies\n3. **Allocation History**: Maintains detailed records of all allocations\n4. **Statistics and Recommendations**: Provides insights into scheduling effectiveness and recommendations for optimization\n5. **Resource Pool Integration**: Works closely with the resource pool manager\n6. **Thread Safety**: Uses Arc and Mutex for thread-safe operations\n7. **Scalability**: Designed to handle large numbers of devices and allocations\n\n## Usage Examples\n\n```rust\nuse ri::device::{RiDeviceScheduler, RiAllocationRequest, RiDeviceType, RiDeviceCapabilities};\nuse ri::device::pool::RiResourcePoolManager;\nuse std::sync::{Arc, Mutex};\n\nfn example() {\n // Create resource pool manager\n let pool_manager = Arc::new(Mutex::new(RiResourcePoolManager::new()));\n \n // Create device scheduler\n let mut scheduler = RiDeviceScheduler::new(pool_manager);\n \n // Set scheduling policy for GPUs\n scheduler.set_policy(RiDeviceType::GPU, ri::device::RiSchedulingPolicy::PriorityBased);\n \n // Create allocation request\n let request = RiAllocationRequest {\n device_type: RiDeviceType::GPU,\n capabilities: RiDeviceCapabilities {\n memory_gb: Some(16.0),\n compute_units: Some(512),\n storage_gb: None,\n bandwidth_gbps: None,\n custom_capabilities: HashMap::new(),\n },\n priority: 5,\n timeout_secs: 30,\n };\n \n // Allocate device\n if let Some(allocation_id) = scheduler.allocate(&request) {\n println!(\"Allocated device with ID: {}\", allocation_id);\n \n // Record release when done\n scheduler.record_release(&allocation_id);\n }\n \n // Get statistics\n let stats = scheduler.get_statistics();\n println!(\"Total allocations: {}\", stats.total_allocations);\n}\n```\nDevice scheduler - manages device resource allocation and scheduling\n\nThis struct implements a comprehensive device scheduling system that manages\nresource allocation using various scheduling algorithms. It works closely with\nthe resource pool manager to access available devices and implements multiple\nscheduling policies per device type.\x00"
Source§const DOC: &'static CStr
const DOC: &'static CStr
text_signature if a constructor is defined. Read moreSource§type ThreadChecker = SendablePyClass<RiDeviceScheduler>
type ThreadChecker = SendablePyClass<RiDeviceScheduler>
Source§type PyClassMutability = <<PyAny as PyClassBaseType>::PyClassMutability as PyClassMutability>::MutableChild
type PyClassMutability = <<PyAny as PyClassBaseType>::PyClassMutability as PyClassMutability>::MutableChild
Source§type BaseNativeType = PyAny
type BaseNativeType = PyAny
PyAny by default, and when you declare
#[pyclass(extends=PyDict)], it’s PyDict.fn items_iter() -> PyClassItemsIter
fn lazy_type_object() -> &'static LazyTypeObject<Self>
fn dict_offset() -> Option<isize>
fn weaklist_offset() -> Option<isize>
Source§impl PyTypeInfo for RiDeviceScheduler
impl PyTypeInfo for RiDeviceScheduler
Source§fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject
fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject
§fn type_object(py: Python<'_>) -> Bound<'_, PyType>
fn type_object(py: Python<'_>) -> Bound<'_, PyType>
§fn is_type_of(object: &Bound<'_, PyAny>) -> bool
fn is_type_of(object: &Bound<'_, PyAny>) -> bool
object is an instance of this type or a subclass of this type.§fn is_exact_type_of(object: &Bound<'_, PyAny>) -> bool
fn is_exact_type_of(object: &Bound<'_, PyAny>) -> bool
object is an instance of this type.impl DerefToPyAny for RiDeviceScheduler
impl ExtractPyClassWithClone for RiDeviceScheduler
Auto Trait Implementations§
impl Freeze for RiDeviceScheduler
impl !RefUnwindSafe for RiDeviceScheduler
impl Send for RiDeviceScheduler
impl Sync for RiDeviceScheduler
impl Unpin for RiDeviceScheduler
impl UnsafeUnpin for RiDeviceScheduler
impl !UnwindSafe for RiDeviceScheduler
Blanket Implementations§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<'py, T> IntoPyObjectExt<'py> for Twhere
T: IntoPyObject<'py>,
impl<'py, T> IntoPyObjectExt<'py> for Twhere
T: IntoPyObject<'py>,
§fn into_bound_py_any(self, py: Python<'py>) -> Result<Bound<'py, PyAny>, PyErr>
fn into_bound_py_any(self, py: Python<'py>) -> Result<Bound<'py, PyAny>, PyErr>
self into an owned Python object, dropping type information.§fn into_py_any(self, py: Python<'py>) -> Result<Py<PyAny>, PyErr>
fn into_py_any(self, py: Python<'py>) -> Result<Py<PyAny>, PyErr>
self into an owned Python object, dropping type information and unbinding it
from the 'py lifetime.§fn into_pyobject_or_pyerr(self, py: Python<'py>) -> Result<Self::Output, PyErr>
fn into_pyobject_or_pyerr(self, py: Python<'py>) -> Result<Self::Output, PyErr>
self into a Python object. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::RequestSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PyErrArguments for T
impl<T> PyErrArguments for T
§impl<T> PyTypeCheck for Twhere
T: PyTypeInfo,
impl<T> PyTypeCheck for Twhere
T: PyTypeInfo,
§const NAME: &'static str = T::NAME
const NAME: &'static str = T::NAME
§fn type_check(object: &Bound<'_, PyAny>) -> bool
fn type_check(object: &Bound<'_, PyAny>) -> bool
§fn classinfo_object(py: Python<'_>) -> Bound<'_, PyAny>
fn classinfo_object(py: Python<'_>) -> Bound<'_, PyAny>
isinstance and issubclass function. Read more