Skip to content

Latest commit

 

History

History
112 lines (74 loc) · 2.17 KB

File metadata and controls

112 lines (74 loc) · 2.17 KB

exns (beta)

This library allows you to interact with Python code from Elixir

Typical flow

  • Expose your desired Python code as a nanoservice
  • Call your code from Elixir language using the exns library

Features

  • Fast – uses nanomsg socket library, and MessagePack (or JSON) for serialization
  • Flexible – your nanoservice can be running on the local machine or remotely on a different computer
  • Simple – your Python code is just one call away

Installation

  • Add exns as dependency
 defp deps do
    [{:exns, "~> 0.3.5-beta"}]
  end
  • Ensure exns app is started
  def application do
    [mod: {<<YOUR-APP-MODULE>>, []},
     applications: [..., :exns, ...]]
  end

Configuration

  • Define your nanoservices in your app's config.exs
### Nanoservices

config :exns, nanoservices: [

  [name: :math_service,
   address: "ipc:///tmp/math-service.sock",
   timeout: 5000,
   workers: 10],

  [name: :string_service,
   address: "ipc:///tmp/string-service.sock",
   timeout: 5000,
   workers: 10,
   encoder: "msgpack"]]  # default encoder is "json"

Usage

First, ensure your defined Python nanoservices are running.

To learn more about writing a nanoservice in Python please see the nanoservice library

  • Making a request from Elixir
# The call format is (serviceName, methodName, arguments)

response = Exns.call(:math_service, "add", [1, 2])

case response do
	{:ok, result} -> IO.puts "1 + 2 = #{result}"
	{:error, error} -> IO.puts "Nano service erred #{inspect error}"
end
  • Making an optimistic request
3 == Exns.call!(:math_service, "add", [1, 2])

Development

Run tests

$ mix test

Stats for simple pings to math service:
---
Concurrency:                    2000 clients
Throughput                      4361 req/sec
Avg. Request Time:              0.23 ms
....

Finished in 0.6 seconds (0.1s on load, 0.4s on tests)
6 tests, 0 failures

Randomized with seed 864352

... and with coverage

$ mix test --cover

MIT License