Showing
1 changed file
with
34 additions
and
21 deletions
@@ -7,23 +7,20 @@ mod routes; | @@ -7,23 +7,20 @@ mod routes; | ||
7 | mod schema; | 7 | mod schema; |
8 | mod uuid; | 8 | mod uuid; |
9 | 9 | ||
10 | -use crate::routes::markdown::*; | ||
11 | -use crate::routes::other::*; | ||
12 | -use crate::routes::user::*; | 10 | +use routes::markdown::*; |
11 | +use routes::other::*; | ||
12 | +use routes::user::*; | ||
13 | +use routes::upload::*; | ||
13 | use crate::uuid::Uuid; | 14 | use crate::uuid::Uuid; |
14 | 15 | ||
15 | use actix_web::{guard, web, App, HttpResponse, HttpServer}; | 16 | use actix_web::{guard, web, App, HttpResponse, HttpServer}; |
16 | -use async_std::channel::Receiver; | ||
17 | -use async_std::channel::Sender; | ||
18 | -use async_std::channel::bounded; | ||
19 | -use async_std::fs::File; | 17 | +use async_std::{ channel::{ Sender, bounded } |
18 | + , fs::File }; | ||
20 | use diesel::r2d2::{self, ConnectionManager}; | 19 | use diesel::r2d2::{self, ConnectionManager}; |
21 | use diesel::SqliteConnection; | 20 | use diesel::SqliteConnection; |
22 | -use futures::AsyncReadExt; | ||
23 | -use futures::AsyncSeekExt; | 21 | +use futures::{ AsyncReadExt, AsyncSeekExt, FutureExt, StreamExt, select |
22 | + , stream::FuturesUnordered }; | ||
24 | use listenfd::ListenFd; | 23 | use listenfd::ListenFd; |
25 | -use routes::markdown::get_markdown; | ||
26 | -use routes::upload::upload; | ||
27 | use std::io::SeekFrom; | 24 | use std::io::SeekFrom; |
28 | use std::sync::Arc; | 25 | use std::sync::Arc; |
29 | 26 | ||
@@ -68,18 +65,34 @@ async fn main() -> std::io::Result<()> { | @@ -68,18 +65,34 @@ async fn main() -> std::io::Result<()> { | ||
68 | 65 | ||
69 | dotenv::dotenv().ok(); | 66 | dotenv::dotenv().ok(); |
70 | 67 | ||
71 | - let ( tx_upload_worker | ||
72 | - , rx_upload_worker ) :( Sender<String> | ||
73 | - , Receiver<String> ) = bounded(32); | 68 | + let (tx_upload_worker, rx_upload_worker) = bounded(32); |
74 | 69 | ||
75 | let _upload_worker = actix_rt::spawn(async move { | 70 | let _upload_worker = actix_rt::spawn(async move { |
76 | - while let Ok(filename) = rx_upload_worker.recv().await { | ||
77 | - let mut f = File::open(&filename).await.unwrap(); | ||
78 | - let mut buf = vec!['.' as u8; 3 * 4096]; | ||
79 | - get_sample(&mut f, buf.as_mut()).await.unwrap(); | ||
80 | - println!("[UPLOAD WORKER] filename: {}", filename); | ||
81 | - println!( "[UPLOAD WORKER] uuid: {}" | ||
82 | - , Uuid::get("some.unique.namespace", buf.as_mut()) ); | 71 | + let mut workers = FuturesUnordered::new(); |
72 | + | ||
73 | + loop { | ||
74 | + select! { | ||
75 | + filename = rx_upload_worker.recv().fuse() => { | ||
76 | + match filename { | ||
77 | + Err(_) => break, | ||
78 | + Ok(filename) => workers.push(async move { | ||
79 | + let mut f = File::open(&filename).await.unwrap(); | ||
80 | + let mut buf = vec!['.' as u8; 3 * 4096]; | ||
81 | + get_sample(&mut f, buf.as_mut()).await.unwrap(); | ||
82 | + println!( "[UPLOAD WORKER] filename: {}" | ||
83 | + , filename ); | ||
84 | + println!( "[UPLOAD WORKER] uuid: {}" | ||
85 | + , Uuid::get( "some.unique.namespace" | ||
86 | + , buf.as_mut() ) ); | ||
87 | + }) | ||
88 | + } | ||
89 | + }, | ||
90 | + _result = workers.next() => {}, | ||
91 | + } | ||
92 | + } | ||
93 | + | ||
94 | + while workers.len() > 0 { | ||
95 | + workers.next().await; | ||
83 | } | 96 | } |
84 | }); | 97 | }); |
85 | 98 |
Please
register
or
login
to post a comment