Skip to content

Instantly share code, notes, and snippets.

@EricSchles
Forked from mariusvniekerk/poormansdag.ipynb
Created July 18, 2018 19:49
Show Gist options
  • Save EricSchles/28ab1400264d616f3fc6b25b474def7b to your computer and use it in GitHub Desktop.
Save EricSchles/28ab1400264d616f3fc6b25b474def7b to your computer and use it in GitHub Desktop.
How to make a simple task execution engine in basically no code
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fetching package metadata .............\n",
"Solving package specifications: .\n",
"\n",
"# All requested packages already installed.\n",
"# packages in environment at /opt/conda:\n",
"#\n",
"graphviz 2.38.0 7 conda-forge\n",
"python-graphviz 0.8.3 py36_0 conda-forge\n",
"streamz 0.3.0 py_0 conda-forge\n",
"xorg-libxpm 3.5.12 0 conda-forge\n",
"xorg-libxrender 0.9.10 0 conda-forge\n"
]
}
],
"source": [
"!conda install -c conda-forge streamz graphviz python-graphviz xorg-libxrender xorg-libxpm --yes"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fetching package metadata ..."
]
}
],
"source": [
"!conda install --yes 'tornado<5'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# How to make a configurable task executor in a handful of lines of python\n",
"\n",
"### Say we have a bunch of tasks that need to run in a particular order, but they need to be configurable by users independent from code."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"x = '''\n",
"---\n",
"name: foo3\n",
"depends:\n",
" - foo2\n",
" - bar\n",
"---\n",
"name: foo4\n",
"depends:\n",
" - foo2\n",
"---\n",
"name: foo2\n",
"depends:\n",
" - foo\n",
" - baz\n",
"---\n",
"name: foo\n",
"depends:\n",
" - bar\n",
" - baz\n",
"---\n",
"name: bar\n",
"depends:\n",
" - baz\n",
" - bazzer\n",
"---\n",
"name: baz\n",
"---\n",
"name: bazzer\n",
"'''"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import ruamel_yaml\n",
"gads = list(ruamel_yaml.load_all(x))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"import networkx as nx"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"G = nx.DiGraph()\n",
"edges = []\n",
"for x in gads:\n",
" G.add_node(x['name'], label=x['name'])\n",
" for e in x.get('depends', ()):\n",
" edges.append((e, x['name']))\n",
"G.add_edges_from(edges)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"nx.draw_shell(\n",
" G, \n",
" labels={k: v['label'] for k, v in G.nodes.data()}\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['bazzer', 'baz', 'bar', 'foo', 'foo2', 'foo4', 'foo3']"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"list(nx.topological_sort(G))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"nx.draw_shell(\n",
" subg, \n",
" labels={k: v['label'] for k, v in subg.nodes.data()}\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"from functools import reduce"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"import time"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"def baz():\n",
" time.sleep(1)\n",
" return 1\n",
"\n",
"def bazzer():\n",
" time.sleep(1)\n",
" return 2\n",
"\n",
"def bar(*args):\n",
" # Streamz and dask have different behaviors here\n",
" res = sum(args)\n",
" time.sleep(res)\n",
" return res\n",
"\n",
"def foo(*args):\n",
" res = sum(args)\n",
" time.sleep(res)\n",
" return res\n",
" \n",
"def foo2(*args):\n",
" return reduce(lambda a, b: a * b, args)\n",
"\n",
"def foo3(*args):\n",
" return sum(args)\n",
"\n",
"def foo4(*args):\n",
" return sum(args)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"import dask\n",
"import distributed\n",
"from IPython.display import IFrame, display\n",
"from sidecar import Sidecar"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"8787"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cluster = distributed.LocalCluster()\n",
"client = distributed.Client(cluster)\n",
"bokeh_port = client.scheduler_info()['services']['bokeh']\n",
"bokeh_port"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If you're watching the [dashboard's status page](http://pangeo.pydata.org/user/mariusvniekerk/proxy/8787/status) then you may want to note two things:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"sc = Sidecar(title='Dask Status')\n",
"with sc:\n",
" display(\n",
" IFrame(f'http://pangeo.pydata.org/user/mariusvniekerk/proxy/{bokeh_port}/status', width='100%', height='100%')\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Poor mans workflow engine"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"bazzer\n",
"baz\n",
"bar\n",
"foo\n",
"foo2\n",
"foo4\n",
"foo3\n"
]
}
],
"source": [
"functions = locals()\n",
"futures = {}\n",
"for d in list(nx.topological_sort(G)):\n",
" print(d)\n",
" deps = (src for src, dest in G.in_edges(d))\n",
" futures[d] = dask.delayed(functions[d], pure=False)(*[futures[d] for d in deps])"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"fut = futures[d]"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fut.visualize(rankdir='LR')"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"({'bazzer': 2, 'baz': 1, 'bar': 3, 'foo': 4, 'foo2': 4, 'foo4': 4, 'foo3': 7},)"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dask.compute(futures)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [default]",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment