GithubHelp home page GithubHelp logo

Comments (5)

pinkforest avatar pinkforest commented on May 27, 2024 1

Cool. I was wondering why vanilla spawn_link! worked - thanks for the explanation. I will send a PR around documenting it and maybe example to do multiple listen's

from lunatic-rs.

pinkforest avatar pinkforest commented on May 27, 2024

.

from lunatic-rs.

bkolobara avatar bkolobara commented on May 27, 2024

Yes, TcpListener::accept() must block. The call to it will return a TcpStream, so it blocks until a TcpStream is available.

What you want is to concurrently listen on multiple ports in different processes, but you can't use AbstractProcesses for it. AbstractProcesses will handle incoming messages in the handle methods sequentially. This means if you have an infinite loop inside of the handle message, no other message will be handled because the handling of this one never finishes.

If you add a spawn_link! to your example:

impl ProcessRequest<HttpServerCommand> for HttpServer {
    type Response = u32;

    fn handle(state: &mut Self::State, _: HttpServerCommand) -> u32 {
        let _ = spawn_link!(|| {
            loop {
                if let Ok((tcp_stream, _peer)) = state.tcp_listener.accept() {
                    let http = Http::start(tcp_stream, Some("hmmm"));
                }
	    }
        });
    }
}

This means that every time the HttpServer receives a HttpServerCommand it will start a linked sub-process that concurrently listens to new incoming connections.

AbstractProcesses are meant for specific use-cases where you have a process that handles incoming messages in an elegant way. If you are dealing with networking, you are better of just using processes spawned from a function.

from lunatic-rs.

pinkforest avatar pinkforest commented on May 27, 2024

Done

from lunatic-rs.

pinkforest avatar pinkforest commented on May 27, 2024

I will also add more complete AbstractProcess & Supervisor example later

from lunatic-rs.

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.