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日

#1381Rust 模式

Download history 206/week @ 2024-06-21 33/week @ 2024-06-28 27/week @ 2024-07-05 69/week @ 2024-07-26 5/week @ 2024-08-02

74 每月下载量

MIT/Apache

64KB
1.5K SLoC

sod-crossbeam

sod::Service 实现用于与 crossbeam 队列交互。

服务实现

  • ArrayQueuePushercrossbeam::queue::ArrayQueue 推送数据
  • ArrayQueueForcePusher 强制向 crossbeam::queue::ArrayQueue 推送数据
  • ArrayQueuePoppercrossbeam::queue::ArrayQueue 弹出数据
  • SegQueuePushercrossbeam::queue::SegQueue 推送数据
  • SegQueuePoppercrossbeam::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 可能封装了 ArrayQueuePopperSegQueuePopper,以提供一种退避机制,避免在轮询循环中忙等待 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