Dzwebs.Net

撰写电脑技术杂文十余年

rust tokio多线程异步查询sqlite数据库示例

Admin | 2023-3-10 21:43:08 | 被阅次数 | 1363

温馨提示!

如果未能解决您的问题,请点击搜索;登陆可复制文章,点击登陆

  rust之tokio多线程异步查询sqlite数据库,代码如下。

use std::sync::{Mutex,Arc};

use std::thread;
use std::thread::sleep;
use std::time::Duration;

use serde_json::{Value};
use serde_json::json;
//下面这段是将数据库的连接设置为全局变量
use lazy_static::lazy_static;
lazy_static! {
static ref MYCON: Mutex<Connection> = {
        let dbfile="MyDb/MyDb.db";
let mycn = Connection::open(dbfile).unwrap();
Mutex::new(mycn)
    };
}

use rusqlite::{params, Connection, Result};

#[derive(Debug)]
struct Myinfor {
    ID: String,
姓名: String,
}

#[tokio::main]
async fn main(){

let mut haddles = vec![];
for i in 1..=1000{
//println!("循环次数:{}",i);
let t = tokio::spawn(async move{
// let c = printinfor(i,format!("rust {}",i).as_str()).await;
// println!("第 {} 次异步",c);

let mut msg = json!({});
msg.as_object_mut().unwrap().insert("ID".to_string(), Value::String("666".to_string()));
let (b,rejson)=myget_examinfor(i,&msg,&MYCON.lock().unwrap());

});
haddles.push(t);
}
for t in haddles{
tokio::join!(t);
}
//下面这部分代码简单一点
// let t1 = tokio::spawn(async{
// let c1 = printinfor("rust1").await;
// println!("{}",c1);
// });
// let t2 = tokio::spawn(async{
// let c2 = printinfor("rust2").await;
// println!("{}",c2);
// });
// let _ = tokio::join!(t1,t2);
}
async fn printinfor(m:i32,s:&str) -> String{
//thread::sleep(Duration::from_millis(10000));
for k in 1..=1000000{
println!("当前线程是:{},循环变量:{}",m,k);
}
String::from(s)
}
fn myget_examinfor(m:i32,MyJson:&Value,con:&Connection)->(bool,Value){
let mut b:bool=false;
let sql:&str = "SELECT * from MyInfor where ID < ?";
    let mut stmt = con.prepare(sql).unwrap();
    let person_iterator = stmt.query_map(params![MyJson["ID"].as_str()], |row| {
        Ok(Myinfor{
ID:row.get(0).unwrap(),
姓名:row.get(1).unwrap(),
        })
    }).unwrap();
let mut mystruct:Vec<Value>=Vec::new();
//p的内容如:Person { ID: "532627198109050546", name: "青山", sex: "男", tel: "13577699235" }
for p in person_iterator {
        //println!("查询到每行的数据是:{:?}", &p.unwrap());//p.unwrap()
if let Ok(e) = p{
//print!("{} - {} \n",e.name,e.sex);
let mut TemJSon = json!({});
TemJSon.as_object_mut().unwrap().insert("ID".to_string(), Value::String(e.ID.to_string()));
TemJSon.as_object_mut().unwrap().insert("姓名".to_string(), Value::String(e.姓名.to_string()));
mystruct.push(TemJSon);
};

b=true;
    }
println!("返回的Vec {:?}",mystruct);

let mut ReJSon = json!({}); //创建空json
ReJSon.as_object_mut().unwrap().insert("结果".to_string(), Value::Array(mystruct));
println!("返回的ReJSon {:?}",ReJSon);
println!("已完成第 {} 次----------------------------------------",m);
(b,ReJSon)
}

该杂文来自: 最新技术

上一篇:rust之thread多线程同时共享变量及修改变量的方法

下一篇:struct之impl下的from.into和new方法

网站备案号:

网站备案号:滇ICP备11001339号-7

版权属性:

Copyright 2007-2021-forever Inc. all Rights Reserved.

联系方式:

Email:dzwebs@126.com QQ:83539231 访问统计