Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ntex runtime panic #335

Closed
pavlospt opened this issue Apr 2, 2024 · 20 comments
Closed

Ntex runtime panic #335

pavlospt opened this issue Apr 2, 2024 · 20 comments

Comments

@pavlospt
Copy link
Contributor

pavlospt commented Apr 2, 2024

Hello, I have opened a PR on Shuttle where I am trying to provide an integration with the Ntex framework. Unfortunately there is a runtime error when we are running the basic example.

thread 'tokio-runtime-worker' panicked at /home/jonaro00/.cargo/registry/src/index.crates.io-6f17d22bba15001f/ntex-rt-0.4.12/src/lib.rs:192:9:
`spawn_local` called from outside of a `task::LocalSet`

The relevant PR is: shuttle-hq/shuttle#1707

Are there any indications on what I might be doing wrong?

Thank you in advance!

@fafhrd91
Copy link
Member

fafhrd91 commented Apr 2, 2024

I quickly look into pr. I don't really understand how shuttle work. technically, ntex should be similar to Actix, but I am not sure how Actix works nowadays. as I remember Actix team decided tight connect Actix and Tokio, on other hand ntex is as neutral as possible, so you might need to construct Tokio runtime via ntex. unfortunately, I don't have much free time to invest

@pavlospt
Copy link
Contributor Author

pavlospt commented Apr 2, 2024

I quickly look into pr. I don't really understand how shuttle work. technically, ntex should be similar to Actix, but I am not sure how Actix works nowadays. as I remember Actix team decided tight connect Actix and Tokio, on other hand ntex is as neutral as possible, so you might need to construct Tokio runtime via ntex. unfortunately, I don't have much free time to invest

Just one question, when you say "construct Tokio runtime" could you explain a bit more what you mean? I am just trying to identify the root cause so that I can resolve it :)

@fafhrd91
Copy link
Member

fafhrd91 commented Apr 2, 2024

someone needs to construct tokio runtime, i dont see this in your pr. all async operations must run from within

@fafhrd91
Copy link
Member

fafhrd91 commented Apr 2, 2024

pub fn block_on<F: Future<Output = ()>>(fut: F) {

@pavlospt
Copy link
Contributor Author

pavlospt commented Apr 2, 2024

Cool thank you very much for your time and insights. I will try to look deeper into it!

@pavlospt
Copy link
Contributor Author

pavlospt commented Apr 2, 2024

@fafhrd91 I have given it a try but apparently since I can get an access to Shuttle's runtime with Handle::current, while I cannot pass it to Ntex I cannot think of a way to avoid having Ntex creating a new runtime and essentially panicking. Am I thinking it wrong?

@fafhrd91
Copy link
Member

fafhrd91 commented Apr 2, 2024

you can try to modify System builder and allow to run it with tokio’s Handler

@pavlospt
Copy link
Contributor Author

pavlospt commented Apr 2, 2024

Also from what I have been reading about Actix's similar documentation, the behaviour between Ntex and Actix looks similar, regarding LocalSet etc!

@pavlospt
Copy link
Contributor Author

pavlospt commented Apr 2, 2024

you can try to modify System builder and allow to run it with tokio’s Handler

You mean by submitting a PR to Ntex to add that feature, right?

@fafhrd91
Copy link
Member

fafhrd91 commented Apr 2, 2024

you can try to modify System builder and allow to run it with tokio’s Handler

You mean by submitting a PR to Ntex to add that feature, right?

right, but just for tokio feature. i dont want to depend on tokio in mid term

@pavlospt
Copy link
Contributor Author

pavlospt commented Apr 2, 2024

you can try to modify System builder and allow to run it with tokio’s Handler

You mean by submitting a PR to Ntex to add that feature, right?

right, but just for tokio feature. i dont want to depend on tokio in mid term

Ok got it, I will give it a try but since I am new to Rust, I might struggle a bit 😄

@pavlospt
Copy link
Contributor Author

pavlospt commented Apr 2, 2024

@fafhrd91 I have opened this. Am I towards a totally wrong direction? #336

@fafhrd91
Copy link
Member

fafhrd91 commented Apr 4, 2024

use ntex::rt::System::new("main").run_local(async {}) in your pr

@fafhrd91 fafhrd91 closed this as completed Apr 4, 2024
@pavlospt
Copy link
Contributor Author

pavlospt commented Apr 4, 2024

Amazing! Thank you very much @fafhrd91 ❤️

@photino
Copy link

photino commented Apr 23, 2024

use ntex::rt::System::new("main").run_local(async {}) in your pr

@fafhrd91 I cannot find the run_local method in the docs for SystemRunner.

@fafhrd91
Copy link
Member

this method available only for tokio feature, probably docs gen params needs to be adjusted

@photino
Copy link

photino commented Apr 23, 2024

@fafhrd91 Thanks!

How can we run async jobs in the background? I have tried

System::new("scheduler")
    .system()
    .arbiter()
    .spawn(Box::pin(async move {
        loop {
            scheduler.tick().await;

            // Cannot use `std::thread::sleep` because it blocks the Tokio runtime.
            time::sleep(scheduler.time_till_next_job()).await;
        }
    }));

But it does not work as expected. The code is from our integration with ntex.

@fafhrd91
Copy link
Member

ntex_rt::spawn(some_fut)

@photino
Copy link

photino commented Apr 23, 2024

ntex_rt::spawn(some_fut)

It returns an error:

`spawn_local` called from outside of a `task::LocalSet`

@fafhrd91
Copy link
Member

you have to pass System::current() from block_on. and the use System::arbiter().spawn()

here is example

let _ = tx.send((srv, ntex::rt::System::current()));

@pavlospt pavlospt changed the title Ntex runtime panick Ntex runtime panic Apr 23, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

3 participants