mirror of
https://git.asonix.dog/asonix/pict-rs
synced 2024-12-22 11:21:24 +00:00
Give background jobs more opportunity to yield to runtime
This commit is contained in:
parent
819b83bab7
commit
7282ee9312
1 changed files with 82 additions and 38 deletions
120
src/queue.rs
120
src/queue.rs
|
@ -216,44 +216,6 @@ pub(crate) async fn process_images<S: Store + 'static>(
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn process_jobs<S, F>(
|
|
||||||
repo: &ArcRepo,
|
|
||||||
store: &S,
|
|
||||||
config: &Configuration,
|
|
||||||
queue: &'static str,
|
|
||||||
callback: F,
|
|
||||||
) where
|
|
||||||
S: Store,
|
|
||||||
for<'a> F: Fn(
|
|
||||||
&'a ArcRepo,
|
|
||||||
&'a S,
|
|
||||||
&'a Configuration,
|
|
||||||
serde_json::Value,
|
|
||||||
) -> LocalBoxFuture<'a, Result<(), Error>>
|
|
||||||
+ Copy,
|
|
||||||
{
|
|
||||||
let worker_id = uuid::Uuid::new_v4();
|
|
||||||
|
|
||||||
loop {
|
|
||||||
tracing::trace!("process_jobs: looping");
|
|
||||||
|
|
||||||
let res = job_loop(repo, store, config, worker_id, queue, callback).await;
|
|
||||||
|
|
||||||
if let Err(e) = res {
|
|
||||||
tracing::warn!("Error processing jobs: {}", format!("{e}"));
|
|
||||||
tracing::warn!("{}", format!("{e:?}"));
|
|
||||||
|
|
||||||
if e.is_disconnected() {
|
|
||||||
tokio::time::sleep(Duration::from_secs(10)).await;
|
|
||||||
}
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct MetricsGuard {
|
struct MetricsGuard {
|
||||||
worker_id: uuid::Uuid,
|
worker_id: uuid::Uuid,
|
||||||
queue: &'static str,
|
queue: &'static str,
|
||||||
|
@ -285,6 +247,55 @@ impl Drop for MetricsGuard {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn process_jobs<S, F>(
|
||||||
|
repo: &ArcRepo,
|
||||||
|
store: &S,
|
||||||
|
config: &Configuration,
|
||||||
|
queue: &'static str,
|
||||||
|
callback: F,
|
||||||
|
) where
|
||||||
|
S: Store,
|
||||||
|
for<'a> F: Fn(
|
||||||
|
&'a ArcRepo,
|
||||||
|
&'a S,
|
||||||
|
&'a Configuration,
|
||||||
|
serde_json::Value,
|
||||||
|
) -> LocalBoxFuture<'a, Result<(), Error>>
|
||||||
|
+ Copy,
|
||||||
|
{
|
||||||
|
let worker_id = uuid::Uuid::new_v4();
|
||||||
|
|
||||||
|
let yield_limit = 8;
|
||||||
|
let mut count = 0;
|
||||||
|
|
||||||
|
loop {
|
||||||
|
tracing::trace!("process_jobs: looping");
|
||||||
|
|
||||||
|
count += 1;
|
||||||
|
count %= yield_limit;
|
||||||
|
|
||||||
|
// yield every 8 iterations to be kind to other tasks
|
||||||
|
if count == 0 {
|
||||||
|
tokio::task::yield_now().await;
|
||||||
|
}
|
||||||
|
|
||||||
|
let res = job_loop(repo, store, config, worker_id, queue, callback).await;
|
||||||
|
|
||||||
|
if let Err(e) = res {
|
||||||
|
tracing::warn!("Error processing jobs: {}", format!("{e}"));
|
||||||
|
tracing::warn!("{}", format!("{e:?}"));
|
||||||
|
|
||||||
|
if e.is_disconnected() {
|
||||||
|
tokio::time::sleep(Duration::from_secs(10)).await;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async fn job_loop<S, F>(
|
async fn job_loop<S, F>(
|
||||||
repo: &ArcRepo,
|
repo: &ArcRepo,
|
||||||
store: &S,
|
store: &S,
|
||||||
|
@ -303,9 +314,20 @@ where
|
||||||
) -> LocalBoxFuture<'a, Result<(), Error>>
|
) -> LocalBoxFuture<'a, Result<(), Error>>
|
||||||
+ Copy,
|
+ Copy,
|
||||||
{
|
{
|
||||||
|
let yield_limit = 8;
|
||||||
|
let mut count = 0;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
tracing::trace!("job_loop: looping");
|
tracing::trace!("job_loop: looping");
|
||||||
|
|
||||||
|
count += 1;
|
||||||
|
count %= yield_limit;
|
||||||
|
|
||||||
|
// yield every 8 iterations to be kind to other tasks
|
||||||
|
if count == 0 {
|
||||||
|
tokio::task::yield_now().await;
|
||||||
|
}
|
||||||
|
|
||||||
let fut = async {
|
let fut = async {
|
||||||
let (job_id, job) = repo.pop(queue, worker_id).await?;
|
let (job_id, job) = repo.pop(queue, worker_id).await?;
|
||||||
|
|
||||||
|
@ -365,9 +387,20 @@ async fn process_image_jobs<S, F>(
|
||||||
{
|
{
|
||||||
let worker_id = uuid::Uuid::new_v4();
|
let worker_id = uuid::Uuid::new_v4();
|
||||||
|
|
||||||
|
let yield_limit = 8;
|
||||||
|
let mut count = 0;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
tracing::trace!("process_image_jobs: looping");
|
tracing::trace!("process_image_jobs: looping");
|
||||||
|
|
||||||
|
count += 1;
|
||||||
|
count %= yield_limit;
|
||||||
|
|
||||||
|
// yield every 8 iterations to be kind to other tasks
|
||||||
|
if count == 0 {
|
||||||
|
tokio::task::yield_now().await;
|
||||||
|
}
|
||||||
|
|
||||||
let res = image_job_loop(
|
let res = image_job_loop(
|
||||||
tmp_dir,
|
tmp_dir,
|
||||||
repo,
|
repo,
|
||||||
|
@ -421,9 +454,20 @@ where
|
||||||
) -> LocalBoxFuture<'a, Result<(), Error>>
|
) -> LocalBoxFuture<'a, Result<(), Error>>
|
||||||
+ Copy,
|
+ Copy,
|
||||||
{
|
{
|
||||||
|
let yield_limit = 8;
|
||||||
|
let mut count = 0;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
tracing::trace!("image_job_loop: looping");
|
tracing::trace!("image_job_loop: looping");
|
||||||
|
|
||||||
|
count += 1;
|
||||||
|
count %= yield_limit;
|
||||||
|
|
||||||
|
// yield every 8 iterations to be kind to other tasks
|
||||||
|
if count == 0 {
|
||||||
|
tokio::task::yield_now().await;
|
||||||
|
}
|
||||||
|
|
||||||
let fut = async {
|
let fut = async {
|
||||||
let (job_id, job) = repo.pop(queue, worker_id).await?;
|
let (job_id, job) = repo.pop(queue, worker_id).await?;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue