Giter Site home page Giter Site logo

Comments (7)

udoprog avatar udoprog commented on August 23, 2024

Hi! You have to use async variants of call / execution functions when running asynchronous code in Rune, like async_call.

from rune.

physics515 avatar physics515 commented on August 23, 2024

@udoprog, I was able to figure that out but I'm stuck in another way. I'm building an app with Tauri and calling the VM from a Tauri Command.

I'm following this example: https://github.com/rune-rs/rune/blob/0.12.x/examples/examples/tokio_spawn.rs but I keep running into an issue with the Vm not implementing Send. Do you know any way to fix this?

from rune.

udoprog avatar udoprog commented on August 23, 2024

Yeah, pass the Arc<Unit> and Arc<RuntimeContext> around, and construct a Vm (which is a cheap operation) when you need to execute something with send_execute.

from rune.

physics515 avatar physics515 commented on August 23, 2024

But the error is on the send_execute call. I was looking into how Tauri does async and it appears their async implementation runs every await point on a new thread...? So that means send_execute is being run on a different thread than the other code, meaning it requires Vm to require a Send implementation.

I did try to spin up a new thread to get out of the Tauri runtime and run a generic tokio runtim, but I was trying to move the Vm into that thread. I'll try to pass the Uint and Runtime to the thread and create the Vm on the thread and see if that works.

I'll report back!

Thank you for your help.

from rune.

udoprog avatar udoprog commented on August 23, 2024

Note that send_execute returns a VmSendExecution, which is 'static and implements Send.

If you keep having issues, place put together a minimal reproduction and I might be able to help.

from rune.

physics515 avatar physics515 commented on August 23, 2024

@udoprog, I figured out my issue. It is actually a Rust language bug where it doesn't drop() references correctly in async runtime.
rust-lang/rust#69663

Instead of this:

let vm = Vm::new(runtime, Arc::new(unit));
let execution = vm.clone().send_execute(["main"], (5u32,))?;

It should be this:

let execution = {
    let vm = Vm::new(runtime, Arc::new(unit));
    vm.clone().send_execute(["main"], (5u32,))?;
};

So that vm is out of scope before the await in:

execution.async_complete().await.unwrap();

or else there is a potential the vm will be moved to a new thread at the await point.

Thank you for your help! I hope this helps someone else.

from rune.

udoprog avatar udoprog commented on August 23, 2024

Glad to hear it. Note that you can do without the .clone() too since you're constructing a Vm for the call.

from rune.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.