{
 "cells": [
  {
   "metadata": {
    "trusted": true
   },
   "cell_type": "code",
   "source": "\nimport threading\nfrom IPython.display import display\nimport ipywidgets as widgets\nimport time\n\ndef get_ioloop():\n    import IPython, zmq\n    ipython = IPython.get_ipython()\n    if ipython and hasattr(ipython, 'kernel'):\n        return zmq.eventloop.ioloop.IOLoop.instance()\n\n\n#The IOloop is shared\nioloop = get_ioloop()\n\n\nclass MyThread(threading.Thread):\n    def __init__(self):\n        super().__init__()\n        \n        self.progress = widgets.FloatProgress(value=0, min=0, max=10)\n        \n        self._quit = threading.Event()\n        self.start()\n    \n    def run(self):\n        i = 0\n        while not self._quit.isSet():\n            def update_progress(i=i):\n                if self._quit.isSet():\n                    return\n                if self.progress.value == 10:\n                    self.progress.value = 0\n                self.progress.value = i\n\n            time.sleep(2)\n\n            ioloop.add_callback(update_progress)\n\n            i += 1\n            if i > 10:\n                i = 0\n        self.progress.value = 10\n        print(\"Quit\")\n            \n    def quit(self):\n        self._quit.set()\n\ndef run_progress():\n    thread = MyThread()\n    display(thread.progress)\n    return thread\n",
   "execution_count": 1,
   "outputs": []
  },
  {
   "metadata": {
    "trusted": true
   },
   "cell_type": "code",
   "source": "#Non blocking cell\nt1 = run_progress()",
   "execution_count": 2,
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "69dca3ea7ff544968303b0161cc1f8a6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": "FloatProgress(value=0.0, max=10.0)"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ]
  },
  {
   "metadata": {
    "trusted": true
   },
   "cell_type": "code",
   "source": "#Non blocking cell\nt2 = run_progress()",
   "execution_count": 3,
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "bfc25cf7eece4fe9bd090a11677c2c5f",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": "FloatProgress(value=0.0, max=10.0)"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ]
  },
  {
   "metadata": {
    "trusted": true
   },
   "cell_type": "code",
   "source": "#Blocking cell\ntime.sleep(5)",
   "execution_count": 4,
   "outputs": []
  },
  {
   "metadata": {
    "trusted": true
   },
   "cell_type": "code",
   "source": "t1.quit()",
   "execution_count": 5,
   "outputs": []
  },
  {
   "metadata": {
    "trusted": true
   },
   "cell_type": "code",
   "source": "t2.quit()",
   "execution_count": 6,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": "Quit\nQuit\n"
    }
   ]
  },
  {
   "metadata": {
    "trusted": true
   },
   "cell_type": "code",
   "source": "",
   "execution_count": null,
   "outputs": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "name": "python3",
   "display_name": "Python 3",
   "language": "python"
  },
  "language_info": {
   "name": "python",
   "version": "3.8.1",
   "mimetype": "text/x-python",
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "pygments_lexer": "ipython3",
   "nbconvert_exporter": "python",
   "file_extension": ".py"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}