From d0afd4077160c075f0427efb07eb917d1114cef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Thu, 5 Jan 2017 00:59:16 +0100 Subject: [PATCH 1/2] Release v1.4.0 announcement --- _includes/search.html | 2 +- ...2017-01-05-elixir-v1-4-0-released.markdown | 134 ++++++++++++++++++ images/contents/iex-coloring.png | Bin 0 -> 36856 bytes 3 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 _posts/2017-01-05-elixir-v1-4-0-released.markdown create mode 100644 images/contents/iex-coloring.png diff --git a/_includes/search.html b/_includes/search.html index aabe51dff..9c7f5f80e 100644 --- a/_includes/search.html +++ b/_includes/search.html @@ -1,6 +1,6 @@

- News: Announcing GenStage + News: Elixir v1.4.0 released

diff --git a/_posts/2017-01-05-elixir-v1-4-0-released.markdown b/_posts/2017-01-05-elixir-v1-4-0-released.markdown new file mode 100644 index 000000000..730a17c83 --- /dev/null +++ b/_posts/2017-01-05-elixir-v1-4-0-released.markdown @@ -0,0 +1,134 @@ +--- +layout: post +title: Elixir v1.4 released +author: José Valim +category: Releases +excerpt: Elixir v1.4 brings many improvements to the language, its standard library and the Mix build tool. +--- + +Elixir v1.4 brings new features, enhancements and bug fixes into Elixir. The most notable changes are the addition of the `Registry` module, the `Task.async_stream/3` and `Task.async_stream/5` function which aid developers in writing concurrent software, and the new application inference and commands added to Mix. + +In this post we will cover the main additions. The complete [release notes](https://github.com/elixir-lang/elixir/releases/tag/v1.4.0) are also available. + +## Registry + +The [`Registry`](https://hexdocs.pm/elixir/Registry.html) is a new module in Elixir's standard library that allows Elixir developers to implement patterns such as name lookups, code dispatching or even a pubsub system in a simple and scalable way. + +Broadly speaking, the Registry is a local, decentralized and scalable key-value process storage. Let's break this in parts: + + * Local because keys and values are only accessible to the current node (opposite to distributed) + * Decentralized because there is no single entity responsible for managing the registry + * Scalable because performance scales linearly with the addition of more cores upon partitioning + +A registry may have unique or duplicate keys. Every key-value pair is associated to the process registering the key. Keys are automatically removed once the owner process terminates. Starting, registering and looking up keys is quite straight-forward: + +```iex +iex> Registry.start_link(:unique, MyRegistry) +iex> {:ok, _} = Registry.register(MyRegistry, "hello", 1) +iex> Registry.lookup(MyRegistry, "hello") +[{self(), 1}] +``` + +Finally, huge thanks to [Bram Verburg](https://twitter.com/voltonez) has performed [extensive benchmarks](https://docs.google.com/spreadsheets/d/1MByRZJMCnZ1wPiLhBEnSRRSuy1QXp8kr27PIOXO3qqg/edit#gid=0) on the registry to show it scales linearly with the number of cores by increasing the number of partitions. + +## Syntax coloring + +Elixir v1.4 introduces the ability to syntax color inspected data structures and IEx automatically relies on this feature to provide syntax coloring for evaluated shell results: + +![IEx coloring](/images/contents/iex-coloring.png) + +This behaviour can be configured via the `:syntax_colors` coloring option: + +```elixir +IEx.configure [colors: [syntax_colors: [atom: :cyan, string: :green]]] +``` + +To disable coloring altogether, simply pass an empty list to `:syntax_colors`. + +## Task.async_stream + +When there is a need to traverse a collection of items concurrently, Elixir developers often resort to tasks: + +```elixir +collection +|> Enum.map(&Task.async(SomeMod, :function, [&1])) +|> Enum.map(&Task.await/1) +``` + +The snippet above will spawn a new task by invoking `SomeMod.function(element)` for every element in the collection and then await for the task results. + +However, the snippet above will spawn and run concurrently as many tasks as there are items in the collection. While this may be fine in many occasions, including small collections, sometimes it is necessary to restrict amount of tasks running concurrently, specially when shared resources are involved. + +Elixir v1.4 adds `Task.async_stream/3` and `Task.async_stream/5` which brings some of the lessons we learned from [the GenStage project](/blog/2016/07/14/announcing-genstage/) directly into Elixir: + +```elixir +collection +|> Task.async_stream(SomeMod, :function, [], max_concurrency: 8) +|> Enum.to_list() +``` + +The code above will also start the same `SomeMod.function(element)` task for every element in the collection except it will also guarantee we have at most 8 tasks being processed at the same time. You can use `System.schedulers_online` to retrieve the number of cores and balance the processing based on the amount of cores available. + +The `Task.async_stream` functions are also lazy, allowing developers to partially consume the stream until a condition is reached. Furthermore, `Task.Supervisor.async_stream/4` and `Task.Supervisor.async_stream/6` can be used to ensure the concurrent tasks are spawned under a given supervisor. + +## Application inference + +In previous Mix versions, most of your dependencies had to be added both to your dependencies list and applications list. Here is how a `mix.exs` would look like: + +```elixir +def application do + [applications: [:logger, :plug, :postgrex]] +end + +def deps do + [{:plug, "~> 1.2"}, + {:postgrex, "~> 1.0"}] +end +``` + +This was a common source of confusion and quite error prone as many developers would not list their dependencies in the applications list. + +Mix v1.4 now automatically infers your applications list as long as you leave the `:applications` key empty. The `mix.exs` above can be rewritten to: + +```elixir +def application do + [extra_applications: [:logger]] +end + +def deps do + [{:plug, "~> 1.2"}, + {:postgrex, "~> 1.0"}] +end +``` + +With the above, Mix will automatically build your application list based on your dependencies. Developers now only need to specify which applications shipped as part of Erlang or Elixir that they require, such as `:logger`. + +Finally, if there is a dependency you don't want to include in the application runtime list, you can do so by specifying the `runtime: false` option: + + {:distillery, "> 0.0.0", runtime: false} + +We hope this feature provides a more streamlined workflow for developers who are building releases for their Elixir projects. + +## Mix install from SCM + +Mix v1.4 can now install escripts and archives from both Git and Hex, providing you with even more options for distributing Elixir code. + +This makes it possible to distribute CLI applications written in Elixir by publishing a package which builds an escript to Hex. [`ex_doc`](https://hex.pm/packages/ex_doc) has been updated to serve as an example of how to use this new functionality. + +Simply running: + + mix escript.install hex ex_doc + +will fetch `ex_doc` and its dependencies, build them, and then install `ex_doc` to `~/.mix/escripts` (by default). After adding `~/.mix/escripts` to your `PATH`, running `ex_doc` is as simple as: + + ex_doc + +You can now also install archives from Hex in this way. Since they are fetched and built on the user's machine, they do not have the same limitations as pre-built archives. However, keep in mind archives are loaded on every Mix command and may conflict with modules or dependnecies in your projects. For this reason, escripts is the preferred format for sharing executables. + +It is also possible to install escripts and archives by providing a Git/GitHub repo. See `mix help escript.install` and `mix help archive.install` for more details. + +## Summing up + +The full list of changes is available in our [release notes](https://github.com/elixir-lang/elixir/releases/tag/v1.4.0). Don't forget to check [the Install section](/install.html) to get Elixir installed and our [Getting Started guide](http://elixir-lang.org/getting-started/introduction.html) to learn more. + +Happy coding! diff --git a/images/contents/iex-coloring.png b/images/contents/iex-coloring.png new file mode 100644 index 0000000000000000000000000000000000000000..7e3e4a67a31f85256227107791ef3c2fa9f60a15 GIT binary patch literal 36856 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≤Mg~|Lqx?Z2FyTFm9Tl?jl(wxHn5CQ2S98T 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 Date: Thu, 5 Jan 2017 01:50:38 +0100 Subject: [PATCH 2/2] Fixes --- _posts/2017-01-05-elixir-v1-4-0-released.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_posts/2017-01-05-elixir-v1-4-0-released.markdown b/_posts/2017-01-05-elixir-v1-4-0-released.markdown index 730a17c83..948e76cd1 100644 --- a/_posts/2017-01-05-elixir-v1-4-0-released.markdown +++ b/_posts/2017-01-05-elixir-v1-4-0-released.markdown @@ -6,7 +6,7 @@ category: Releases excerpt: Elixir v1.4 brings many improvements to the language, its standard library and the Mix build tool. --- -Elixir v1.4 brings new features, enhancements and bug fixes into Elixir. The most notable changes are the addition of the `Registry` module, the `Task.async_stream/3` and `Task.async_stream/5` function which aid developers in writing concurrent software, and the new application inference and commands added to Mix. +Elixir v1.4 brings new features, enhancements and bug fixes. The most notable changes are the addition of the `Registry` module, the `Task.async_stream/3` and `Task.async_stream/5` function which aid developers in writing concurrent software, and the new application inference and commands added to Mix. In this post we will cover the main additions. The complete [release notes](https://github.com/elixir-lang/elixir/releases/tag/v1.4.0) are also available. @@ -29,7 +29,7 @@ iex> Registry.lookup(MyRegistry, "hello") [{self(), 1}] ``` -Finally, huge thanks to [Bram Verburg](https://twitter.com/voltonez) has performed [extensive benchmarks](https://docs.google.com/spreadsheets/d/1MByRZJMCnZ1wPiLhBEnSRRSuy1QXp8kr27PIOXO3qqg/edit#gid=0) on the registry to show it scales linearly with the number of cores by increasing the number of partitions. +Finally, huge thanks to [Bram Verburg](https://twitter.com/voltonez) who has performed [extensive benchmarks](https://docs.google.com/spreadsheets/d/1MByRZJMCnZ1wPiLhBEnSRRSuy1QXp8kr27PIOXO3qqg/edit#gid=0) on the registry to show it scales linearly with the number of cores by increasing the number of partitions. ## Syntax coloring @@ -123,7 +123,7 @@ will fetch `ex_doc` and its dependencies, build them, and then install `ex_doc` ex_doc -You can now also install archives from Hex in this way. Since they are fetched and built on the user's machine, they do not have the same limitations as pre-built archives. However, keep in mind archives are loaded on every Mix command and may conflict with modules or dependnecies in your projects. For this reason, escripts is the preferred format for sharing executables. +You can now also install archives from Hex in this way. Since they are fetched and built on the user's machine, they do not have the same limitations as pre-built archives. However, keep in mind archives are loaded on every Mix command and may conflict with modules or dependencies in your projects. For this reason, escripts is the preferred format for sharing executables. It is also possible to install escripts and archives by providing a Git/GitHub repo. See `mix help escript.install` and `mix help archive.install` for more details.