Decrusting the tokio crate

แชร์
ฝัง
  • เผยแพร่เมื่อ 20 พ.ย. 2024

ความคิดเห็น • 76

  • @christsciple
    @christsciple 7 หลายเดือนก่อน +31

    I have been writing code since I was a wee little eleven year old boy, now going on almost 30 years and time and again I am humbled and learn new something new with each video of yours! These are truly gems Jon!

  • @brendanwenzel
    @brendanwenzel 7 หลายเดือนก่อน +202

    Dude, the level of depth you go into is so far beyond anyone else in this space. Seriously, you're an animal!

    • @0x1337feed
      @0x1337feed 7 หลายเดือนก่อน +16

      a Rustanean to be accurate

    • @volkan8583
      @volkan8583 7 หลายเดือนก่อน +6

      GOAT must be applicable here

    • @lazarus6983
      @lazarus6983 3 หลายเดือนก่อน +1

      This dude is an animal. Seriously

    • @abbashaider7165
      @abbashaider7165 3 หลายเดือนก่อน

      yeah the animal, the GOAT

  • @oof-software
    @oof-software 7 หลายเดือนก่อน +17

    The "Async in depth" entry in the tokio tutorials is also a really nice read!
    I didn't really understand the whole waker thing before reading that.

  • @sbx1720
    @sbx1720 7 หลายเดือนก่อน +18

    My dude delivered quality content again! Thank you sir. Please continue with the series.

  • @christopher8641
    @christopher8641 7 หลายเดือนก่อน +1

    As always, thank you so very much for putting the time into these videos. I've written tons of code with tokio and still managed to absorb some new thoughts and concepts. Maybe an idea for a future crust of rust might be an implementation of an async executor. Although, I'm not sure if it is a large endeavor, or a bit too deep in the weeds.
    I love that these videos are not step by step tutorials but rather a tutorial on how someone could arrive at an implementation. It's patterns instead of recipes.

  • @felixcantournet
    @felixcantournet 7 หลายเดือนก่อน +38

    the tokio::pain!() (instead of pin) typo is just *chef_kiss*

  • @sagnikc395
    @sagnikc395 7 หลายเดือนก่อน +2

    thanks for this stream, just finished the riust book a few days back and wanted to learn about async programming in rust in depth . this is invaluable !!!

  • @loobersoog
    @loobersoog 7 หลายเดือนก่อน +13

    Another invaluable stream

  • @aliakbarmostafaei
    @aliakbarmostafaei 2 หลายเดือนก่อน +1

    Would love an episode dedicated to tokio channels and async synchronization of a multi threaded tokio program.

  • @burgerking4for410
    @burgerking4for410 7 หลายเดือนก่อน +6

    Just today I was thinking "Hmm, is there a 'Decrusting Tokio'?". Great!

  • @Fyyro
    @Fyyro 7 หลายเดือนก่อน +7

    Hey, excited to watch the video! You mentioned your discord server and said the link outloud but a link in the description you could click would be super nice!

    • @jonhoo
      @jonhoo  7 หลายเดือนก่อน +1

      Done!

  • @bouraouiyacine1359
    @bouraouiyacine1359 2 หลายเดือนก่อน +1

    Jon is a rust beast , incredibly skilled you rock

  • @АртемФедоров-ю7б
    @АртемФедоров-ю7б 7 หลายเดือนก่อน +1

    If I am not mistaken regarding select and why you can not pass future.await in select "arms" is that .await is simply instruction to await for the future and it should actually prevent from progressing the function body further. So that's why you need to pass a future and select will handle all of the "polling" tasks on it's own

  • @pwalski
    @pwalski 2 หลายเดือนก่อน

    3:08:52 Regarding inefficiency of processing data one by one with `mpsc` instead of doing it in batches (in a form of e.g. `Mutex`) I believe methods `mpsc::Receiver::recv_many` and `poll_recv_many` have been created to solve exactly this problem.

    • @jonhoo
      @jonhoo  2 หลายเดือนก่อน

      Looks like that's only on tokio channels, not std ones? Even so, those are helpful, but they only help with the acquisition cost - they don't let you do things like work compaction (eg, if a later update replaces an older one rather than add to it).

  • @flyingsquirrel3271
    @flyingsquirrel3271 7 หลายเดือนก่อน

    That watch channel seems useful. In fact, after watching your video about channels, I implemented a sync version of exactly that idea (never published). It makes sense to just look into these modules to get to know the tools available. I guess I should do that more often :)

  • @bobby9568
    @bobby9568 7 หลายเดือนก่อน +9

    Amazing Jon is at it again!

  • @ahuggingsam
    @ahuggingsam 6 หลายเดือนก่อน +1

    Love these streams! Could I also request a de crusting stream on the nom crate? That would be very helpful to me. Thanks for all you do either way!

    • @meowsqueak
      @meowsqueak 8 วันที่ผ่านมา

      nom isn’t well maintained these days - consider switching to winnow.

  • @cappuccinopapi3038
    @cappuccinopapi3038 7 หลายเดือนก่อน +4

    Does anyone know if there's something similar to this channel for Golang? The quality of learning material for Rust is just extraordinary

    • @pratikkulkarni891
      @pratikkulkarni891 7 หลายเดือนก่อน

      Have you checked out Ultimate Go by William Kennedy? It's not a channel rather a course, but goes in pretty deep in the language.

  • @AmosRothberg
    @AmosRothberg 2 หลายเดือนก่อน

    At 45:14 - 48:00 you talk about shutdown, and unless I misunderstood the documentation you make incorrect statements.
    for instance:
    when the main future exits, the OS does NOT immediately shut down all the threads -
    from the docs:
    'Tasks spawned through Runtime::spawn keep running until they yield. Then they are dropped. They are not guaranteed to run to completion, but might do so if they do not yield until completion.
    Blocking functions spawned through Runtime::spawn_blocking keep running until they return.
    The thread initiating the shutdown blocks until all spawned work has been stopped. This can take an indefinite amount of time. The Drop implementation waits forever for this.'
    also, shutdown_background & shutdown_timeout do NOT shutdown gracefully.

  • @austinbelknap125
    @austinbelknap125 6 หลายเดือนก่อน

    A helpful follow-on to this video would be the "tonic" crate, particularly how streaming RPCs work with tokio stream.

  • @gfasterOS
    @gfasterOS 4 หลายเดือนก่อน

    1:04:39 I don't know if it's been addressed later on, but there's definitely a difference between Tokio Instant and std Instant. In if the testing feature is enabled, Tokio Instant works off an internal clock so Tokio can time warp through sleep calls so tests don't take forever.

  • @rasoulmesghali
    @rasoulmesghali 7 หลายเดือนก่อน +1

    So excited to watch this brilliant video, thanks Jon

  • @12e2aela7
    @12e2aela7 7 หลายเดือนก่อน

    Hi Jon, Thank you for your invaluable stream 🦀

  • @Lucs-ku5cb
    @Lucs-ku5cb 7 หลายเดือนก่อน +4

    Next "decrusting Iced crate"

  • @理塘丁真-j3p
    @理塘丁真-j3p 7 หลายเดือนก่อน +1

    will you talk about pin trait in another crust of rust video? I think it's hard for me to understand = =

  • @honeywu6862
    @honeywu6862 4 หลายเดือนก่อน

    Can't show my thanks any more. You are a great presenter!

  • @jahsehisntdead9333
    @jahsehisntdead9333 หลายเดือนก่อน +1

    I watched 3 hours of this late at night after it appeared from autoplay, idk what you were saying but it was good background noise 8/10

  • @guacharo.w3871
    @guacharo.w3871 21 วันที่ผ่านมา

    Also tokio mpsc channel use semaphore with capacity as permits number. Same for mpsc queue custom implementations is useful (like with cordyceps crate)

  • @bruceritchie7613
    @bruceritchie7613 7 หลายเดือนก่อน +1

    Til cargo expand .. among a bunch of other things! Thx!

  • @NeronRVV
    @NeronRVV 7 หลายเดือนก่อน

    Could you explain or link to something that goes into detail on why Sink trait is not that great? My only guess is that encoding data is usually less error prone than decoding it, so additional trait on top of AsyncWrite might be redundant.
    Edit: should've waited for a few minutes before commenting

  • @LB767
    @LB767 7 หลายเดือนก่อน

    Not sure I understood the difference between awaiting a bunch of futures in a LocalSet and just using a regular join! macro?

  • @LB-mf4bs
    @LB-mf4bs 2 หลายเดือนก่อน

    At #2:00:34, what does it mean "whoever reads it first has it" talking about Receiver of mpsc? there is just one receiver, there is no second or third receiver.

  • @metaltyphoon
    @metaltyphoon 26 วันที่ผ่านมา

    The CancellationToken is just like C# one, except that methods with are async always have a CancellationToken as the last parameter instead of being inside a select arm.

  • @erikwigelandiestad2270
    @erikwigelandiestad2270 2 วันที่ผ่านมา

    Earned a new subscriber ❤

  • @simonfarre4907
    @simonfarre4907 4 หลายเดือนก่อน +1

    The fact that this video has 60k is the problem with Rust. People come to Rust, from languages which have concurrency primitives like coroutines (and no multi threading) and therefore think that it's a good idea to reach for async first (instead of pure multi threading). My from-the-hip guess, is that I suspect 90% of all projects using Tokio shouldn't and are probably *worse off* for doing so.
    Coroutines are very rarely better than pure multi threading in my experience and opinion. For many reasons, really.

    • @zanityplays
      @zanityplays 3 หลายเดือนก่อน

      coroutines are often better than pure multithreading as a lot of people deal with io bound workloads

  • @rustprogrammer
    @rustprogrammer 7 หลายเดือนก่อน

    What an excellent video!

  • @drvanon
    @drvanon 7 หลายเดือนก่อน

    About notify-ing and moving to the runnable queue. If i were to only implement Future, how would the runtime figure out when to try polling?

    • @antonf.9278
      @antonf.9278 7 หลายเดือนก่อน

      The poll method takes a context that contains a waker.
      This waker seems to come from the runtime and you are supposed to wake it to indicate that you are ready to be polled again.
      To call the waker you need to gain control of the CPU, this comes from the kernel (or the hardware directly if you run bare metal) and depends on the specific thing you are doing. If you call the kernel it should take a callback and without a kernel you need set a hardware interrupt.

  • @АнатолийБугаков-е9г
    @АнатолийБугаков-е9г 4 หลายเดือนก่อน

    39:00 what if you spawn more OS threads ( std::thread::spawn) from within spawn_blocking? Would that block all other Tokio workers or would Tokio handle that?

    • @aimericsorindev253
      @aimericsorindev253 9 วันที่ผ่านมา

      Then it would be the OS scheduler that would choose to give CPU time to either the tokio worker threads or the OS threads you spanwed

  • @junhaozhu4763
    @junhaozhu4763 7 หลายเดือนก่อน +1

    How come you know so many details? I cannot find such resource elsewhere.

    • @christopher8641
      @christopher8641 7 หลายเดือนก่อน

      Experience, fork the code base, ask questions, make small but quality contributions, write a ton of code, read a ton of code

  • @catsolstice
    @catsolstice 4 หลายเดือนก่อน

    Thank you, Jon 🙏

  • @luckystrike91
    @luckystrike91 6 หลายเดือนก่อน

    why rust doesn't have push-based stream (rx)?

  • @yokebabjr3866
    @yokebabjr3866 7 หลายเดือนก่อน

    Why do we need AsyncRead/AsyncWrite in the first place? Couldn't they juste be a special case of Stream/Sink where the element is an u8?

    • @jonhoo
      @jonhoo  7 หลายเดือนก่อน +3

      They technically could, but that would be very very inefficient. There's generally overhead to every method call, even if it's usually fairly small, and incurring that for every single byte read or written would be too much for a lot of workloads.

  • @navibongo9354
    @navibongo9354 7 หลายเดือนก่อน

    Godly video man!

  • @ridcully
    @ridcully 7 หลายเดือนก่อน

    Very helpful talk

  • @leonie9248
    @leonie9248 7 หลายเดือนก่อน

    Yes!!! Thank you so much!

  • @deanroddey2881
    @deanroddey2881 7 หลายเดือนก่อน

    It all sounded good until the whole mutex discussion. Obviously objects having mutexes always run the risk of helper methods recursively locking and other issues. But the number of gotchas required by async for these and other issues sort of undermines a major benefit of Rust which is it doesn't require every team member to be a veteran, human vigilance to avoid housekeeping issues, and minimizes spooky action at a distance. Those issues seem to undermine the potential simplification of using async a good bit in practical terms.
    I could see doing my own bespoke baby 'runtimes' for very specific scenarios, where the async'ness doesn't infect everything I guess, and where the complexity remains fairly low because it's not trying to be all things to all people.

    • @jonhoo
      @jonhoo  7 หลายเดือนก่อน +1

      Clippy actually already has a lint for catching using the wrong kind of mutex (rust-lang.github.io/rust-clippy/master/index.html#/await_holding_lock), and there's been an effort to get it into rustc itself (github.com/rust-lang/rust/issues/71072). You can also always _safely_ use the async version of the mutex, it's only if you try to use the sync version (to boost performance) that you have to be careful. Note further that using the sync version inside of sync code that is then called by async code is _also_ not a problem since sync code doesn't contain any awaits (by definition).

  • @vimau010
    @vimau010 7 หลายเดือนก่อน +1

    Thanks!

  • @kylidboy
    @kylidboy 7 หลายเดือนก่อน +1

    best of the best

  • @rajmajumdar5253
    @rajmajumdar5253 7 หลายเดือนก่อน +1

    Wow this is insane bro, really insane, nobody has gone to this much depth. Many thanks .
    Also can you tell me how you have the top bar of the firefox below? Also which fork of Firefox are you using?

    • @jonhoo
      @jonhoo  7 หลายเดือนก่อน +1

      Thanks! For setup-related things, see th-cam.com/video/xmqpzpzdjI8/w-d-xo.html :)

  • @JG-nm9zk
    @JG-nm9zk 2 หลายเดือนก่อน +1

    This is one crusty corner of rust.

  • @tiagoneves7068
    @tiagoneves7068 7 หลายเดือนก่อน +1

    Que aula 🎉

  • @OccultDemonCassette
    @OccultDemonCassette 2 หลายเดือนก่อน

    Okay what is going on in Japan and why are so many Tokyo workers running around grabbing futures. I just woke up and I'm half asleep and TH-cam autoplay this and I do not understand anything that is being said. Who is waking up Japanese poll workers and why?

  • @ACIB708
    @ACIB708 7 หลายเดือนก่อน

    holy shit!

  • @dominicfischer2891
    @dominicfischer2891 7 หลายเดือนก่อน

    "I'm not gonna get too deep into How to write an asynchronous scheduler" 😿

  • @noviriustomeisho6630
    @noviriustomeisho6630 7 หลายเดือนก่อน

    Can you turn this into a playlist instead of video annotations? It's very difficult to rewind when a sliver of the play bar is basically 10min

    • @jonhoo
      @jonhoo  7 หลายเดือนก่อน +6

      You should be able to go directly to each chapter either by clicking the timestamps in the video description, or by clicking the name of the chapter and then TH-cam will give you a full chapter list on the right just like how a playlist is shown :)

    • @deryilz
      @deryilz 7 หลายเดือนก่อน +1

      on desktop, you can also do ctrl with the right or left arrows to move to the start of chapters

  • @Cbon-xh3ry
    @Cbon-xh3ry หลายเดือนก่อน

    Thanks for those videos. You should really mute yourself when you drink, cough, swallow etc.. cause it’s really loud and disturbing… keep up the good work !

  • @Henisha22
    @Henisha22 5 หลายเดือนก่อน

    Thanks!