#job-queue #task-queue #queue #job #task #sqlite #jobs


An embeddable task queue based on SQLite (renamed to effectum)

6 releases

0.2.0 Dec 3, 2022
0.1.4 Nov 26, 2022

#1945 in Asynchronous

Download history 112/week @ 2024-02-25 2/week @ 2024-03-03 8/week @ 2024-03-10 53/week @ 2024-03-31

61 downloads per month


3.5K SLoC

This project has been renamed to effectum, to avoid confusion with a company named Prefect which is in a somewhat similar space.


A SQLite-based task queue library that allows running background jobs without requiring external dependencies.

use prefect::{Error, Job, JobState, JobRunner, RunningJob, Queue, Worker};

pub struct JobContext {
   // database pool or other things here

#[derive(Serialize, Deserialize)]
struct RemindMePayload {
  email: String,
  message: String,

async fn remind_me_job(job: RunningJob, context: Arc<JobContext>) -> Result<(), Error> {
    let payload: RemindMePayload = job.json_payload()?;
    // do something with the job

#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<(), Error> {
  // Create a queue
  let queue = Queue::new(Path::new("prefect.db")).await?;

  // Define a job type for the queue.
  let a_job = JobRunner::builder("remind_me", remind_me_job).build();

  let context = Arc::new(JobContext{
    // database pool or other things here

  // Create a worker to run jobs.
  let worker = Worker::builder(&queue, context)

  // Submit a job to the queue.
  let job_id = Job::builder("remind_me")
    .run_at(time::OffsetDateTime::now_utc() + std::time::Duration::from_secs(3600))
    .json_payload(&RemindMePayload {
        email: "me@example.com".to_string(),
        message: "Time to go!".to_string()

  // See what's happening with the job.
  let status = queue.get_job_status(job_id).await?;
  assert_eq!(status.state, JobState::Pending);

  // Do other stuff...



~625K SLoC