我悟了,忘记 save thread了

This commit is contained in:
shenjack 2025-02-11 23:25:47 +08:00
parent 4eb553473d
commit 4866f2ec2e
Signed by: shenjack
GPG Key ID: 7B1134A979775551
3 changed files with 16 additions and 6 deletions

View File

@ -47,6 +47,7 @@ pub async fn start_ica(config: &IcaConfig, stop_reciver: StopGetter) -> ClientRe
event!(Level::INFO, "ica-async-rs v{} initing", crate::ICA_VERSION);
let start_connect_time = std::time::Instant::now();
let socket = match ClientBuilder::new(config.host.clone())
.transport_type(TransportType::Websocket)
.on_any(async_any_callback!(events::any_event))
@ -65,7 +66,7 @@ pub async fn start_ica(config: &IcaConfig, stop_reciver: StopGetter) -> ClientRe
.await
{
Ok(client) => {
event!(Level::INFO, "socketio connected");
event!(Level::INFO, "socketio connected time: {:?}", start_connect_time.elapsed());
client
}
Err(e) => {

View File

@ -224,7 +224,7 @@ pub async fn ica_new_message_py(message: &ica::messages::NewMessage, client: &Cl
let client = class::ica::IcaClientPy::new(client);
let args = (msg, client);
let task = call_py_func!(args, plugin, path, ICA_NEW_MESSAGE_FUNC, client);
// PY_TASKS.lock().await.push_ica_new_message(task);
PY_TASKS.lock().await.push_ica_new_message(task);
}
}
@ -237,7 +237,7 @@ pub async fn ica_delete_message_py(msg_id: ica::MessageId, client: &Client) {
let client = class::ica::IcaClientPy::new(client);
let args = (msg_id.clone(), client);
let task = call_py_func!(args, plugin, path, ICA_DELETE_MESSAGE_FUNC, client);
// PY_TASKS.lock().await.push_ica_delete_message(task);
PY_TASKS.lock().await.push_ica_delete_message(task);
}
}
@ -253,6 +253,6 @@ pub async fn tailchat_new_message_py(
let client = class::tailchat::TailchatClientPy::new(client);
let args = (msg, client);
let task = call_py_func!(args, plugin, path, TAILCHAT_NEW_MESSAGE_FUNC, client);
// PY_TASKS.lock().await.push_tailchat_new_message(task);
PY_TASKS.lock().await.push_tailchat_new_message(task);
}
}

View File

@ -451,6 +451,7 @@ fn init_py_with_env_path(path: &str) {
// 使用 Py_InitializeFromConfig 初始化 python
let status = pyo3::ffi::Py_InitializeFromConfig(&config as *const _);
pyo3::ffi::PyEval_SaveThread();
// 清理配置
pyo3::ffi::PyConfig_Clear(config_ptr);
match status._type {
@ -513,11 +514,19 @@ pub async fn post_py() -> anyhow::Result<()> {
status.config.sync_status_to_config();
status.config.write_to_default()?;
// stop_tasks().await;
stop_tasks().await;
unsafe {
if !pyo3::ffi::Py_FinalizeEx() == 0 {
event!(Level::ERROR, "Python 退出失败 (不过应该无所谓)");
}
}
Ok(())
}
async fn stop_tasks() {
if call::PY_TASKS.lock().await.is_empty() {
return ;
}
let waiter = tokio::spawn(async {
call::PY_TASKS.lock().await.join_all().await;
});
@ -526,7 +535,7 @@ async fn stop_tasks() {
event!(Level::INFO, "Python 任务完成");
}
_ = tokio::signal::ctrl_c() => {
// call::PY_TASKS.lock().await.cancel_all();
call::PY_TASKS.lock().await.cancel_all();
event!(Level::INFO, "Python 任务被中断");
}
}