6 个版本
0.3.4 | 2024年6月26日 |
---|---|
0.3.3 | 2024年6月26日 |
0.3.1 | 2023年10月15日 |
0.2.3 | 2023年7月25日 |
0.2.2 | 2023年4月20日 |
#1381 在 Rust 模式
74 每月下载量
64KB
1.5K SLoC
sod-crossbeam
sod::Service
实现用于与 crossbeam
队列交互。
服务实现
ArrayQueuePusher
向crossbeam::queue::ArrayQueue
推送数据ArrayQueueForcePusher
强制向crossbeam::queue::ArrayQueue
推送数据ArrayQueuePopper
从crossbeam::queue::ArrayQueue
弹出数据SegQueuePusher
向crossbeam::queue::SegQueue
推送数据SegQueuePopper
从crossbeam::queue::SegQueue
弹出数据
异步
任何服务都可以使用 self.into_async()
表示为 AsyncService
。
use crossbeam::queue::ArrayQueue;
use sod::{PollService, Service};
use sod_crossbeam::ArrayQueuePopper;
use std::{sync::Arc, time::Duration};
let q = Arc::new(ArrayQueue::<i32>::new(128));
let async_popper = ArrayQueuePopper::new(Arc::clone(&q)).into_mut();
阻塞
sod::PollService
可能封装了 ArrayQueuePopper
或 SegQueuePopper
,以提供一种退避机制,避免在轮询循环中忙等待 CPU。
use crossbeam::queue::ArrayQueue;
use sod::{idle::backoff, PollService, Service};
use sod_crossbeam::ArrayQueuePopper;
use std::{sync::Arc, time::Duration};
let q = Arc::new(ArrayQueue::<i32>::new(128));
let popper = PollService::new(ArrayQueuePopper::new(Arc::clone(&q)), backoff);
loop {
println!("received: {}", popper.process(()).unwrap());
}
sod::RetryService
可能封装了 ArrayQueuePusher
,以阻塞并连续重试将元素推送到 ArrayQueue
,直到成功。
use crossbeam::queue::ArrayQueue;
use sod::{RetryService, Service, idle::yielding};
use sod_crossbeam::ArrayQueuePusher;
use std::sync::Arc;
let q = Arc::new(ArrayQueue::new(128));
let pusher = RetryService::new(ArrayQueuePusher::new(Arc::clone(&q)), yielding);
pusher.process(123).unwrap();
pusher.process(456).unwrap();
依赖
~0.3–0.8MB
~18K SLoC