jaeyson

jaeyson

When to use async and sync code in Elixir?

Sorry for the very vague noob question, I really want to ask this:

When do we use async or sync code in the context of Elixir? AFAIK genserver call is synchronous which is blocking code. Do you have a real example or when do you decide which one to use? I’ve read these article When should I use asynchronous code in JavaScript? – Nico Zerpa, Your JavaScript Friend, but I haven’t found a good example when it is better to use sync over async and vice versa. Any help/enlightenment is greatly appreciated :pray:.

Most Liked

Maartz

Maartz

Hey! That’s a very good question.
I’ve found this post from elixirforum very interesting.

If it doesn’t answer your question, it should give you some clues to decide whether when you should use sync or async.
Hope it will help.

dewetblomerus

dewetblomerus

Great question @jaeyson

Sync Example

Imagine you want to read data from a source data store and write it to a destination data store. The requirements are not real-time. As long as the data arrives within 24 hours, everyone is happy.

Imagine the source data store will happily let you read 100,000 records per second.

Imagine the source data is bursty. Once per hour 1000,000 records show up in a few seconds and then nothing for the rest of the hour. And imagine the destination data store slows down when you make concurrent writes and it can’t handle batches larger than 1000 without spending much more money and re-architecture.

You can have a single Genserver responsible for writing to the destination.

Your code that consumes from the source data does not need to know anything about rate limiting or slowing down because it will receive back-pressure from the Genserver every time it tries to use call, which will block the process until it is done writing the batch to the destination.

Async example

Imagine you need to make 5 API requests and present a combination of all the data to the user. You could use Task.async to make all 5 requests, and after that, Task.await all of them.

If the Sync example is too slow

If you started with the sync example and you realize that you need to process faster, Elixir has a very deep toolbox for speeding things up by using an unbounded or configurable number of processes.

OvermindDL1

OvermindDL1

Something more simple:

Call a sync function when you want to wait on the result before doing more.

Call an async function when you want to do the call, do other stuff, then handle the result later, or if you don’t care about the result at all.

Where Next?

Popular Backend topics Top

AstonJ
Or which features of current frameworks you use you feel you couldn’t live without?
New
DevotionGeo
Some time ago I read somewhere that Rocket will work with stable versions of Rust. The previous version’s changelog says, “Core: Removed...
New
Jsdr3398
I’ve recently become interested in Elixir and all it’s neat perks. And since I’m currently working on a messaging platform; elixir seems ...
New
First poster: bot
proposal: Go 2: permit types to say they may only be created by containing package · Issue #43123 · golang/go. It would be useful to per...
New
kelvinst
I have being some Elixir open-source contributions and side projects. Oh, and I’m doing them on livestreams on my twitch channel, follow ...
New
OvermindDL1
Woooooooo! This is such a huge release for it, and 2 years incoming! In short, the library is now using an updated hyper backend (not j...
New
mafinar
I did not add this to a “this weekend I’ll learn” like my few other journals as I am decided on using this in the long term. Last I work...
New
AstonJ
And the blog: Rails has been unapologetically full stack since the beginning. We’ve continuously sought to include ever-more default an...
New
lucasvegi
Hello guys! Perhaps some of you have already seen this invitation on other channels in the Elixir community or even responded to our surv...
New
apoorv-2204
Hi everyone, I’m considering pursuing the Elixir/Erlang certification exam offered by Erlang Solutions and wanted to check in with the c...
New

Other popular topics Top

ohm
Which, if any, games do you play? On what platform? I just bought (and completed) Minecraft Dungeons for my Nintendo Switch. Other than ...
New
PragmaticBookshelf
Rust is an exciting new programming language combining the power of C with memory safety, fearless concurrency, and productivity boosters...
New
AstonJ
I have seen the keycaps I want - they are due for a group-buy this week but won’t be delivered until October next year!!! :rofl: The Ser...
New
PragmaticBookshelf
Tailwind CSS is an exciting new CSS framework that allows you to design your site by composing simple utility classes to create complex e...
New
PragmaticBookshelf
Build highly interactive applications without ever leaving Elixir, the way the experts do. Let LiveView take care of performance, scalabi...
New
mafinar
This is going to be a long an frequently posted thread. While talking to a friend of mine who has taken data structure and algorithm cou...
New
PragmaticBookshelf
Author Spotlight Rebecca Skinner @RebeccaSkinner Welcome to our latest author spotlight, where we sit down with Rebecca Skinner, auth...
New
RobertRichards
Hair Salon Games for Girls Fun Girls Hair Saloon game is mainly developed for kids. This game allows users to select virtual avatars to ...
New
PragmaticBookshelf
Fight complexity and reclaim the original spirit of agility by learning to simplify how you develop software. The result: a more humane a...
New
PragmaticBookshelf
A concise guide to MySQL 9 database administration, covering fundamental concepts, techniques, and best practices. Neil Smyth MySQL...
New