Skip to content
By using Twitter’s services you agree to our Cookies Use. We and our partners operate globally and use cookies, including for analytics, personalisation, and ads.

This is the legacy version of twitter.com. We will be shutting it down on June 1, 2020. Please switch to a supported browser, or disable the extension which masks your browser. You can see a list of supported browsers in our Help Center.

  • Home Home Home, current page.
  • About

Saved searches

  • Remove
  • In this conversation
    Verified accountProtected Tweets @
Suggested users
  • Verified accountProtected Tweets @
  • Verified accountProtected Tweets @
  • Language: English
    • Bahasa Indonesia
    • Bahasa Melayu
    • Català
    • Čeština
    • Dansk
    • Deutsch
    • English UK
    • Español
    • Filipino
    • Français
    • Hrvatski
    • Italiano
    • Magyar
    • Nederlands
    • Norsk
    • Polski
    • Português
    • Română
    • Slovenčina
    • Suomi
    • Svenska
    • Tiếng Việt
    • Türkçe
    • Ελληνικά
    • Български език
    • Русский
    • Српски
    • Українська мова
    • עִבְרִית
    • العربية
    • فارسی
    • मराठी
    • हिन्दी
    • বাংলা
    • ગુજરાતી
    • தமிழ்
    • ಕನ್ನಡ
    • ภาษาไทย
    • 한국어
    • 日本語
    • 简体中文
    • 繁體中文
  • Have an account? Log in
    Have an account?
    · Forgot password?

    New to Twitter?
    Sign up
stjepang's profile
Stjepan Glavina
Stjepan Glavina
Stjepan Glavina
@stjepang

Tweets

Stjepan Glavina

@stjepang

async runtimes and concurrency primitives in @rustlang he/they (available for hire)

Berlin, Germany
stjepang.github.io
Joined October 2009

Tweets

  • © 2020 Twitter
  • About
  • Help Center
  • Terms
  • Privacy policy
  • Imprint
  • Cookies
  • Ads info
Dismiss
Previous
Next

Go to a person's profile

Saved searches

  • Remove
  • In this conversation
    Verified accountProtected Tweets @
Suggested users
  • Verified accountProtected Tweets @
  • Verified accountProtected Tweets @

Promote this Tweet

Block

  • Tweet with a location

    You can add location information to your Tweets, such as your city or precise location, from the web and via third-party applications. You always have the option to delete your Tweet location history. Learn more

    Your lists

    Create a new list


    Under 100 characters, optional

    Privacy

    Copy link to Tweet

    Embed this Tweet

    Embed this Video

    Add this Tweet to your website by copying the code below. Learn more

    Add this video to your website by copying the code below. Learn more

    Hmm, there was a problem reaching the server.

    By embedding Twitter content in your website or app, you are agreeing to the Twitter Developer Agreement and Developer Policy.

    Preview

    Why you're seeing this ad

    Log in to Twitter

    · Forgot password?
    Don't have an account? Sign up »

    Sign up for Twitter

    Not on Twitter? Sign up, tune into the things you care about, and get updates as they happen.

    Sign up
    Have an account? Log in »

    Two-way (sending and receiving) short codes:

    Country Code For customers of
    United States 40404 (any)
    Canada 21212 (any)
    United Kingdom 86444 Vodafone, Orange, 3, O2
    Brazil 40404 Nextel, TIM
    Haiti 40404 Digicel, Voila
    Ireland 51210 Vodafone, O2
    India 53000 Bharti Airtel, Videocon, Reliance
    Indonesia 89887 AXIS, 3, Telkomsel, Indosat, XL Axiata
    Italy 4880804 Wind
    3424486444 Vodafone
    » See SMS short codes for other countries

    Confirmation

     

    Welcome home!

    This timeline is where you’ll spend most of your time, getting instant updates about what matters to you.

    Tweets not working for you?

    Hover over the profile pic and click the Following button to unfollow any account.

    Say a lot with a little

    When you see a Tweet you love, tap the heart — it lets the person who wrote it know you shared the love.

    Spread the word

    The fastest way to share someone else’s Tweet with your followers is with a Retweet. Tap the icon to send it instantly.

    Join the conversation

    Add your thoughts about any Tweet with a Reply. Find a topic you’re passionate about, and jump right in.

    Learn the latest

    Get instant insight into what people are talking about now.

    Get more of what you love

    Follow more accounts to get instant updates about topics you care about.

    Find what's happening

    See the latest conversations about any topic instantly.

    Never miss a Moment

    Catch up instantly on the best stories happening as they unfold.

    1. Stjepan Glavina‏ @stjepang Mar 25
      • Report Tweet
      • Report NetzDG Violation

      Ideas on how to model structured concurrency in Rust, as well as some thoughts on tasks, errors, and panics... 1/29

      1 reply 23 retweets 85 likes
      Show this thread
    2. Stjepan Glavina‏ @stjepang Mar 25
      • Report Tweet
      • Report NetzDG Violation

      But first, what is structured concurrency anyway? Here are some links worth checking out. 2/29 https://en.wikipedia.org/wiki/Structured_concurrency … https://kotlinlang.org/docs/reference/coroutines/basics.html#structured-concurrency … https://medium.com/@elizarov/structured-concurrency-722d765aa952 …https://trio.discourse.group/t/structured-concurrency-kickoff/55 …

      1 reply 2 retweets 6 likes
      Show this thread
    3. Stjepan Glavina‏ @stjepang Mar 25
      • Report Tweet
      • Report NetzDG Violation

      Put succinctly, structured concurrency is all about robustly spawning/awaiting tasks and propagating errors/panics from child tasks into parent tasks, more or less. 3/29

      1 reply 2 retweets 5 likes
      Show this thread
    4. Stjepan Glavina‏ @stjepang Mar 25
      • Report Tweet
      • Report NetzDG Violation

      Tokio kicked off a research effort on structured concurrency. Some great ideas were proposed, but we're still pretty much at square one and don't have readily available solutions. 4/29https://github.com/tokio-rs/tokio/issues/1879 …

      1 reply 2 retweets 5 likes
      Show this thread
    5. Stjepan Glavina‏ @stjepang Mar 25
      • Report Tweet
      • Report NetzDG Violation

      Right now, all our "hello world" TCP echo examples are suffering from glaring problems. Take for example these from tokio and async-std. 5/29 https://github.com/tokio-rs/tokio/blob/57ba37c97854d32e691ea68006c8d69d58c79b23/examples/echo.rs … https://github.com/async-rs/async-std/blob/2dbebe54ede4d2c0a18380f51e785d5306022ac5/examples/tcp-echo.rs …

      1 reply 0 retweets 3 likes
      Show this thread
    6. Stjepan Glavina‏ @stjepang Mar 25
      • Report Tweet
      • Report NetzDG Violation

      Tokio's example panics on errors with expect(), which is a shame because it would be much nicer to use the ? operator. Panics inside tasks are then silently "swallowed" by tokio and ignored, i.e. they don't propagate anywhere. 6/29pic.twitter.com/g9r1la9nfR

      2 replies 1 retweet 6 likes
      Show this thread
    7. Stjepan Glavina‏ @stjepang Mar 25
      • Report Tweet
      • Report NetzDG Violation

      Async-std's example uses the ? operator inside tasks, but we have to remember to unwrap() the result after awaiting process(), or else errors get lost. Panics inside tasks will get async-std to crash the whole process. 7/29pic.twitter.com/WAxGp4SgFp

      1 reply 1 retweet 3 likes
      Show this thread
    8. Stjepan Glavina‏ @stjepang Mar 25
      • Report Tweet
      • Report NetzDG Violation

      It feels natural and tempting to just do task::spawn(process(stream)), but in that case errors will be totally ignored, and the compiler won't even give us a warning! Both async-std and tokio have this pitfall. 8/29

      2 replies 1 retweet 2 likes
      Show this thread
    9. Stjepan Glavina‏ @stjepang Mar 25
      • Report Tweet
      • Report NetzDG Violation

      Neither async-std nor tokio have mechanisms to handle errors robustly. The compiler does not give us errors nor warnings. Instead, the programmer needs to be careful and remember to add some extra code to handle errors and should at least think about panics. 9/29

      1 reply 0 retweets 2 likes
      Show this thread
    10. Stjepan Glavina‏ @stjepang Mar 25
      • Report Tweet
      • Report NetzDG Violation

      There is good news, though! Rust is a powerful language when it comes to encouraging robust code through warnings and compile-time errors, and we can take advantage of that. Here's how... 10/29

      1 reply 0 retweets 2 likes
      Show this thread
      Stjepan Glavina‏ @stjepang Mar 25
      • Report Tweet
      • Report NetzDG Violation

      Let's replace JoinHandle<T> with a new type simply called Task<T> that is very similar except it also acts like a guard that cancels the task when dropped. Task<T> is an awaitable future that resolves to a value of type T, which is the task's result. 11/29

      8:55 AM - 25 Mar 2020
      • 6 Likes
      • Keith Noguchi Yuji Kanagawa Aaron Turon dougfort Giles folding@home Cope ⚡🦀 🦀 shady khalifa
      2 replies 0 retweets 6 likes
        1. New conversation
        2. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          When a task is cancelled, it gets immediately woken and the next time the executor takes it out from the task queue, it will be simply dropped. Automatic cancellation is one of the core tenets of structured concurrency. 12/29

          1 reply 0 retweets 3 likes
          Show this thread
        3. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          Task<T> is also marked with #[must_use], so if you accidentally drop it without ever using it, the compiler warns you. That aligns closely with how futures typically work - dropping a future implies its cancellation. 13/29pic.twitter.com/dqAI9mWFUY

          1 reply 0 retweets 6 likes
          Show this thread
        4. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          If you want to keep the task running in the background with no strings attached, forget() its Task<T> handle. 14/29pic.twitter.com/USMwYCt1pL

          2 replies 0 retweets 2 likes
          Show this thread
        5. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          But here's the catch: you can only forget() tasks that resolve to (), which means you can't accidentally forget() a task that resolves to a Result or some other type. Now spawn(process(stream)) doesn't even compile - problem solved! 15/29

          2 replies 0 retweets 9 likes
          Show this thread
        6. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          The compiler now requires us to unwrap results in spawned tasks. But it'd be nice to have some API sugar here that is not as verbose as this... 16/29pic.twitter.com/YB7eLhDSgh

          1 reply 0 retweets 2 likes
          Show this thread
        7. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          What if there were unwrap() and expect() methods on Task<Result<T,E>> that transform it into Task<T> and panic on error? Those methods spawn a new task that simply unwraps the result and returns the success value. 17/29pic.twitter.com/7eQfRDqSN8

          1 reply 0 retweets 2 likes
          Show this thread
        8. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          Now we can do spawn(process(stream)).unwrap().forget(), which is pretty nice! This is what the entire TCP echo server looks like in my new runtime I'm working on. 18/29pic.twitter.com/H9Z2Nm9TOJ

          3 replies 0 retweets 11 likes
          Show this thread
        9. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          Finally, what about panics? Tokio silently ignores panics, meaning they might accidentally slip through. In particular, if an assertion fails in a task spawned from tokio within a unit test, the test will pass when it should fail! 19/29pic.twitter.com/3Mf9WskU4I

          2 replies 0 retweets 5 likes
          Show this thread
        10. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          Async-std crashes on panics. If an assertion fails in a task spawned from async-std within a unit test, the whole process crashes. No panics can slip through. 20/29pic.twitter.com/PTOTXiuOaE

          1 reply 0 retweets 2 likes
          Show this thread
        11. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          Crashing the entire process immediately is a bit annoying. If the whole process crashes, the test suite will not display the nicely formatted report of failed unit tests at the end. 21/29

          1 reply 0 retweets 3 likes
          Show this thread
        12. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          We need a panic handling strategy that is harsher than tokio's and gentler than async-std's. Why don't we propagate panics into the executor? 22/29

          1 reply 0 retweets 1 like
          Show this thread
        13. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          In the case of async-std, it's not really obvious where the executor exactly is. Its thread pool is running in the background and we can only crash the process or perhaps let the user specify a custom panic handler. 23/29

          1 reply 0 retweets 3 likes
          Show this thread
        14. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          In tokio, the executor is the tokio Runtime instance, so instead of ignoring errors it'd make sense for Runtime::block_on() to propagate panics from tasks. 24/29pic.twitter.com/EF6m8hvgWK

          1 reply 0 retweets 1 like
          Show this thread
        15. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          For now, suppose we had a very simple single-threaded runtime invoked by a function called run(), which propagates panics upwards. Don't think too much about it because I will tweet more about runtimes later... 25/29pic.twitter.com/qJaXb9eKbc

          1 reply 0 retweets 2 likes
          Show this thread
        16. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          In unit tests, panic propagation does the right thing by default, and it doesn't crash the whole test suite so we get a nice report at the end. 26/29pic.twitter.com/cQoG6uwvyo

          1 reply 0 retweets 1 like
          Show this thread
        17. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          When run() propagates panics, it's up to the user to handle them however they wish. Panics can be ignored, logged, or simply left to continue unwinding. 27/29

          1 reply 0 retweets 1 like
          Show this thread
        18. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          In summary: 28/29 1. Tasks are cancelled when dropped. 2. Tasks can't get accidentally dropped because we get compiler warnings. 3. Errors in tasks cannot get silently lost because we get compiler errors. 4. Unwrapping errors is easy. 5. Panics are propagated into the executor.

          1 reply 1 retweet 18 likes
          Show this thread
        19. Stjepan Glavina‏ @stjepang Mar 25
          • Report Tweet
          • Report NetzDG Violation

          That's all! This design isn't the "holy grail" of structured concurrency by any means, but it gets us very far with little effort and eliminates a lot of common pitfalls in async Rust. 29/29

          2 replies 0 retweets 23 likes
          Show this thread
        20. End of conversation

      Loading seems to be taking a while.

      Twitter may be over capacity or experiencing a momentary hiccup. Try again or visit Twitter Status for more information.

        Promoted Tweet

        false

        • © 2020 Twitter
        • About
        • Help Center
        • Terms
        • Privacy policy
        • Imprint
        • Cookies
        • Ads info