-
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
gonzalo
committed
May 31, 2017
1 parent
ad98f5a
commit d9df031
Showing
6 changed files
with
208 additions
and
38 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,19 +1,75 @@ | ||
# Piton | ||
|
||
**TODO: Add description** | ||
|
||
## Installation | ||
[![hex.pm](https://img.shields.io/hexpm/v/piton.svg?style=flat-square)](https://hex.pm/packages/piton) [![hexdocs.pm](https://img.shields.io/badge/docs-latest-green.svg?style=flat-square)](https://hexdocs.pm/piton/) [![Build Status](https://travis-ci.org/mendrugory/piton.svg?branch=master)](https://travis-ci.org/mendrugory/piton) | ||
|
||
`Piton` is a library which will help you to run your Python code. | ||
|
||
If [available in Hex](https://hex.pm/docs/publish), the package can be installed | ||
by adding `piton` to your list of dependencies in `mix.exs`: | ||
You can implement your own `Piton.Port` and run your python code but I highly recommend to use `Piton.Pool`, | ||
a pool which will allow to run Python code in parallel, a way of avoiding the GIL, and it will protect you from | ||
python exceptions. | ||
|
||
## Installation | ||
Add `piton` to your list of dependencies in `mix.exs`: | ||
|
||
```elixir | ||
def deps do | ||
[{:piton, "~> 0.1.0"}] | ||
end | ||
``` | ||
```elixir | ||
def deps do | ||
[{:piton, "~> 0.1.0"}] | ||
end | ||
``` | ||
|
||
|
||
Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc) | ||
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can | ||
be found at [https://hexdocs.pm/piton](https://hexdocs.pm/piton). | ||
## How to use it | ||
Define your own `port` | ||
|
||
* The Easiest one | ||
```elixir | ||
defmodule MySimplePort do | ||
use Piton.Port | ||
end | ||
``` | ||
|
||
* A port with some wrapper functions which will help you to call the python function: | ||
*YOUR_MODULE.execute(pid, python_module, python_function, list_of_arguments)* | ||
```elixir | ||
defmodule MyCustomPort do | ||
use Piton.Port | ||
def start_link(), do: MyCustomPort.start_link([path: Path.expand("python_folder"), python: "python"], [name: __MODULE__]) | ||
def fun(n), do: MyCustomPort.execute(__MODULE__, :functions, :fun, [n]) | ||
end | ||
``` | ||
|
||
* A port prepared to be run by `Piton.Pool` | ||
They have to have a function *start()* and it has not to be linked. | ||
```elixir | ||
defmodule MyPoolPort do | ||
use Piton.Port | ||
def start(), do: MyPoolPort.start([path: Path.expand("python_folder"), python: "python"], []) | ||
def fun(n), do: MyPoolPort.execute(__MODULE__, :functions, :fun, [n]) | ||
end | ||
``` | ||
|
||
### Run a Pool | ||
Pay attention to the number of Pythons you want to run in parallel. It does not exist an optimal number, maybe it is the | ||
number of cores, maybe half or maybe double. Test it with your application. | ||
```elixir | ||
{:ok, pool} = Piton.Pool.start_link([module: MyPoolPort, pool_number: pool_number], []) | ||
``` | ||
### Call a Port (No pool) | ||
```elixir | ||
iex> MyCustomPort.execute(pid_of_the_port, python_module, python_function, list_of_arguments_of_python_function) | ||
``` | ||
|
||
### Call a Pool | ||
```elixir | ||
iex> Piton.Pool.execute(pid_of_the_pool, elixir_function, list_of_arguments_of_elixir_function) | ||
``` | ||
|
||
## Test | ||
Run the tests. | ||
```bash | ||
mix test | ||
``` | ||
|
||
## Name | ||
Pitón is only Python in Spanish :stuck_out_tongue_winking_eye: :snake: |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,78 @@ | ||
defmodule Piton do | ||
@moduledoc """ | ||
Documentation for Piton. | ||
# Piton | ||
`Piton` is a library which will help you to run your Python code. | ||
You can implement your own `Piton.Port` and run your python code but I highly recommend to use `Piton.Pool`, | ||
a pool which will allow to run Python code in parallel, a way of avoiding the GIL, and it will protect you from | ||
python exceptions. | ||
## Installation | ||
Add `piton` to your list of dependencies in `mix.exs`: | ||
```elixir | ||
def deps do | ||
[{:piton, "~> 0.1.0"}] | ||
end | ||
``` | ||
## How to use it | ||
Define your own `port` | ||
* The Easiest one | ||
```elixir | ||
defmodule MySimplePort do | ||
use Piton.Port | ||
end | ||
``` | ||
* A port with some wrapper functions which will help you to call the python function: | ||
*YOUR_MODULE.execute(pid, python_module, python_function, list_of_arguments)* | ||
```elixir | ||
defmodule MyCustomPort do | ||
use Piton.Port | ||
def start_link(), do: MyCustomPort.start_link([path: Path.expand("python_folder"), python: "python"], [name: __MODULE__]) | ||
def fun(n), do: MyCustomPort.execute(__MODULE__, :functions, :fun, [n]) | ||
end | ||
``` | ||
* A port prepared to be run by `Piton.Pool` | ||
They have to have a function *start()* and it has not to be linked. | ||
```elixir | ||
defmodule MyPoolPort do | ||
use Piton.Port | ||
def start(), do: MyPoolPort.start([path: Path.expand("python_folder"), python: "python"], []) | ||
def fun(n), do: MyPoolPort.execute(__MODULE__, :functions, :fun, [n]) | ||
end | ||
``` | ||
### Run a Pool | ||
Pay attention to the number of Pythons you want to run in parallel. It does not exist an optimal number, maybe it is the | ||
number of cores, maybe half or maybe double. Test it with your application. | ||
```elixir | ||
{:ok, pool} = Piton.Pool.start_link([module: MyPoolPort, pool_number: pool_number], []) | ||
``` | ||
### Call a Port (No pool) | ||
```elixir | ||
iex> MyCustomPort.execute(pid_of_the_port, python_module, python_function, list_of_arguments_of_python_function) | ||
``` | ||
### Call a Pool | ||
```elixir | ||
iex> Piton.Pool.execute(pid_of_the_pool, elixir_function, list_of_arguments_of_elixir_function) | ||
``` | ||
## Test | ||
Run the tests. | ||
```bash | ||
mix test | ||
``` | ||
## Name | ||
Pitón is only Python in Spanish :stuck_out_tongue_winking_eye: :snake: | ||
""" | ||
|
||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,5 @@ | ||
%{"erlport": {:hex, :erlport, "0.9.8", "b7dc57eb87f215a671926bfbcd23e6e9c76f8653b0d072627b41431ef51c4d20", [:rebar3], []}, | ||
%{"earmark": {:hex, :earmark, "1.2.2", "f718159d6b65068e8daeef709ccddae5f7fdc770707d82e7d126f584cd925b74", [:mix], []}, | ||
"erlport": {:hex, :erlport, "0.9.8", "b7dc57eb87f215a671926bfbcd23e6e9c76f8653b0d072627b41431ef51c4d20", [:rebar3], []}, | ||
"ex_doc": {:hex, :ex_doc, "0.16.1", "b4b8a23602b4ce0e9a5a960a81260d1f7b29635b9652c67e95b0c2f7ccee5e81", [:mix], [{:earmark, "~> 1.1", [hex: :earmark, optional: false]}]}, | ||
"flow": {:hex, :flow, "0.12.0", "32c5a5f3ff6693e004b6c17a8c64dce2f8cdaf9564912d79427176013a586ab6", [:mix], [{:gen_stage, "~> 0.12.0", [hex: :gen_stage, optional: false]}]}, | ||
"gen_stage": {:hex, :gen_stage, "0.12.0", "74ec6f84ea0e0e81aa26b745870495094de1c59bfdbd012ae3103208ea124623", [:mix], []}} |