DEV Community

Grayson Hay
Grayson Hay

Posted on • Originally published at garden.graysonarts.com

2

Rust Snippet: Exec with Update Intervals

Recently, I needed to kick off a long running process for encoding videos using ffmpeg in the middle of handling an SQS message. In order to keep the message from showing back up in the queue before the video processing is finished.

So that means, I need to be able to send the change message visibility timeout periodically during the process. so, I came up with this little function to help. It calls a “progress” function every 10 seconds while the command is executing, and then ends once it’s done.

Using tokio as the Async Runtime

pub async fn exec<F, Fut>(mut cmd: Command, progress: F) -> Result<Output, ProgressingExecError>
where
    F: Fn() -> Fut,
    Fut: Future<Output = ()>,
{
    let (tx, mut rx) = oneshot::channel();
    let mut interval = interval(Duration::from_millis(10000));

    tokio::spawn(async move {
        let output = cmd.output().await;
        let _ = tx.send(output);
    });

    loop {
        tokio::select! {
            _ = interval.tick() => progress().await,
            msg = &mut rx => return Ok(msg??)
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Image of Timescale

Timescale – the developer's data platform for modern apps, built on PostgreSQL

Timescale Cloud is PostgreSQL optimized for speed, scale, and performance. Over 3 million IoT, AI, crypto, and dev tool apps are powered by Timescale. Try it free today! No credit card required.

Try free

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay