Last active
January 5, 2023 08:17
-
-
Save ioluwayo/cd5aeacc61744470926f22a060483d59 to your computer and use it in GitHub Desktop.
Use Threads for IO
This file contains hidden or 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
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"provenance": [], | |
"authorship_tag": "ABX9TyNcj9mLzYhyTFiurLJEGVMe", | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3" | |
}, | |
"language_info": { | |
"name": "python" | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/ioluwayo/cd5aeacc61744470926f22a060483d59/sample2.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 279 | |
}, | |
"id": "HKl7PEmT-KcA", | |
"outputId": "4e152475-537b-4ed7-b917-d60fa43c8348" | |
}, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
], | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAcQAAAEGCAYAAAD7f+WgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAU4klEQVR4nO3df7RdZX3n8fcHgoCI4BB/RBQjCK2ESMSAEKqDju1oscDMQKsyM8TlaHUqSpmxUqcD2lW7QhlsC4zDAlsQRWBpZZqCYuu0GCUkmMSEBCksBLSKM4JIjMKAxO/8sZ+rxzs3uSfhnnPuvXm/1rrr7vPsH+f73JPkk2fvffeTqkKSpF3dbqMuQJKk6cBAlCQJA1GSJMBAlCQJMBAlSQJgzqgL0M6ZO3duzZ8/f9RlSNKMsnbt2oeq6tkTrTMQZ6j58+ezZs2aUZchSTNKkm9ua52nTCVJwkCUJAkwECVJAgxESZIAA1GSJMBAlCQJMBAlSQIMREmSAH8xf8ba+J3NzD/nxlGXoSG4f9mJoy5B2iU4QpQkCQNRkiTAQJQkCTAQJUkCDERJkgADUZIkwECUJAkwECVJAgxESZIAA1GSJMBAlCQJMBAlSQIMREmSAANRkiTAQJQkCTAQJUkCDERJkgADUZIkwECUJAkwECVJAgxESZIAA1GSJMBAlCQJMBAlSQIMREmSAANRkiTAQJQkCTAQJUkCDERJkgADUZIkwECUJAkwECVJAgxESZIAA1GSJMBAlCQJMBAlSQIMREmSAANRkiTAQJQkCTAQJUkCpmkgJvnTJGf1vP5Cko/1vL4wydlJTkpyTms7JcnhPdvcnGTxdt5jYZL17evhJPe15S8mOSHJDYPqX08N85NsGvT7SJImNy0DEbgFWAKQZDdgLrCgZ/0SYGVVLa+qZa3tFOBw+lRVG6tqUVUtApYD72uvX9fvMZLs3u+2kqTpbboG4krguLa8ANgEbEnyrCR7Ai8F1iVZmuSSJEuAk4AL2ijvkLbvaUluS3J3klftYA3PSPKZJP+Y5OokAUhyf5Lzk6xrx/+1JLcmWZfk00me0bY7N8lXk2xKclnP/q9IsiHJBuB3xt4syYJW6/oktyc5dOd+dJKknTEtA7GqHgCeTHIQ3WjwVmA1XUguBjZW1RM926/kF0d532ir5lTVMcBZwHk7WMbL236HAwcDx/es+35VHQV8EfgD4HXt9Rrg7LbNJVV1dFUdAewNvLG1XwGcWVVHjnu/dwJ/3kasi4Fvjy8oyTuSrEmyZuujm3ewO5Kk7ZmWgdispAvDsUC8tef1LX0e47Pt+1pg/g6+/21V9e2q+imwftz+17Xvx9IF5i1J1gNnAC9q616TZHWSjcBrgQVJ9gf2r6oVbZtP9BzzVuADSd4PvKiqHhtfUFVdVlWLq2rx7k/fbwe7I0nanukciGPXERfSnTJdRTdCXEIXlv14vH3fCszZwfd/vGd5/P4/bt8D/N3YtciqOryq3pZkL+CjwKlVtRC4HNhre29WVZ+iO+37GPC5JK/dwXolSU/BdA7ElXSnGR+uqq1V9TCwP10oThSIW4B9h1gfdCF9fJKXACTZJ8lh/Dz8HmrXFE8FqKpHgEeS/Epbf/rYgZIcDNxbVRcBfw28bEh9kCQxvQNxI93dpavGtW2uqocm2P5a4H1JvtZzU81AVdWDwFLgmiS30532/OUWfJfTjWy/AHy1Z7e3Av+9nWJNT/tvApta+xHAVYPvgSRpTKpq1DVoJ+w579Cad8afjboMDcH9y04cdQnSrJFkbVVN+Dvq03mEKEnS0BiIkiRhIEqSBBiIkiQBBqIkSYCBKEkSYCBKkgQYiJIkAQaiJEmAgShJEmAgSpIEGIiSJAEGoiRJgIEoSRJgIEqSBBiIkiQBBqIkSYCBKEkSYCBKkgQYiJIkAQaiJEmAgShJEmAgSpIEGIiSJAEGoiRJgIEoSRJgIEqSBBiIkiQBBqIkSYCBKEkSYCBKkgQYiJIkAQaiJEmAgShJEgBztrcyydnbW19VH5naciRJGo3tBiKwb/v+S8DRwPL2+jeA2wZVlCRJw7bdQKyqDwEkWQEcVVVb2usPAjcOvDpJkoak32uIzwWe6Hn9RGuTJGlWmOyU6ZirgNuSXA8EOBm4clBFaXILD9yPNctOHHUZkjRr9BWIVfXhJJ8HXgUU8Naq+tpAK5MkaYj6HSECbAV+SheIPx1MOZIkjUZf1xCTvBe4GpgLPAf4ZJIzB1mYJEnD1O8I8W3AK6vqxwBJzgduBS4eVGGSJA1Tv3eZhu6U6ZitrU2SpFmh3xHiFcDqdpcpwCnAXwymJEmShq/fu0w/kuRLwPGtybtMJUmzyo7cZboe+O7YPkkOqqpvDaQqSZKGrK9AbHeUngf8H35+/bCAlw2uNEmShqffEeJ7gV+qqu8PshhJkkal37tM/wnYPMhCJEkapX7nQ7wXuDnJjcDjY+udD1GSNFv0Ox/it9rX09oXdNcQJUmaFfqdD/G0qvp077okpw2yMEmShqnfa4i/32ebJEkz0mTXEN8A/DpwYJKLelY9E3hykIVJkjRMk11DfABYA5wErO1p3wL87qCKkiRp2Ca7hrgB2JDkU23bg6rqrqFUJknSEPV7DfH1dI9uuwkgyaIkywdWlSRJQ9ZvIH4QOAZ4BKCq1gMvHlBNkiQNXb+B+JOqGv+kGn8PUZI0a/T7LNM7krwF2D3JocB7gJWDK0uT2fidzcw/58ZRlyFJQ3X/shMHdux+R4hnAgvoHtt2DfBD4KxBFSVJ0rD1O0Hwo8B/aV+SJM06k/1i/nbvJK2qk6a2HEmSRmOyEeJxdFM/XQOsppsYWJKkWWeyQHwe8KvAm4G3ADcC11TVHYMuTJKkYdruTTVVtbWqbqqqM4BjgXvo5kV891CqkyRpSCa9qSbJnsCJdKPE+cBFwPWDLUuSpOGa7Kaaq4AjgM8BH6qqTUOpSpKkIZtshPhvgR8D7wXek/zsnpoAVVXPHGBtkiQNzWSzXfT7i/uSJM1oBp4kSRiIkiQBBqIkSYCBKEkSYCBKkgQYiJIkAQaiJEmAgShJEmAgSpIEGIiSJAEGoiRJgIEoSRJgIEqSBBiIkiQBBqIkSYCBKEkSYCBKkgQYiJIkAQaiJEmAgShJEmAgSpIEGIiSJAEGoiRJgIEoSRJgIEqSBBiIkiQBBqIkSYCBKEkSYCBKkgQYiJIkAQMKxCR/muSsntdfSPKxntcXJjk7yUlJzmltpyQ5vGebm5MsnqJ6PrCN9tVJ1if5VpIH2/L6JPOT/Ggq3ruP2u5PMncY7yVJ2rZBjRBvAZYAJNkNmAss6Fm/BFhZVcurallrOwU4nMGYMBCr6pVVtQg4F7iuqha1r/v7OWiSOVNYoyRphAYViCuB49ryAmATsCXJs5LsCbwUWJdkaZJLkiwBTgIuaCO0Q9q+pyW5LcndSV4FkGSvJFck2Zjka0le09qXJrlkrIAkNyQ5IckyYO923Kt3pBNJPpxkQ5JVSZ7b2q5McmmS1cCfJDkkyU1J1ib5cpJfbtv9RhuBfi3JF3v2PyDJ3ya5o42a09r3SXJje79NSX5rx3/skqSdNZBArKoHgCeTHEQ3GrwVWE0XkouBjVX1RM/2K4HlwPvaCO0bbdWcqjoGOAs4r7X9TrdLLQTeDHw8yV7bqeUc4LF23NN3oBv7AKuq6khgBfD2nnUvAJZU1dnAZcCZVfUK4D8DH23bfAU4tqpeDlwL/F5rPw/4SlUtAK4HDmrtrwceqKojq+oI4KbxBSV5R5I1SdZsfXTzDnRFkjSZQZ7yW0kXhkuAjwAHtuXNdKdU+/HZ9n0tML8t/wpwMUBV/WOSbwKHTU3Jv+AJ4Iae9//VnnWfrqqtSZ5B16dPJxlbt2f7/gLguiTzgKcB97X2VwP/utV/Y5IftPaNwIVJzgduqKovjy+oqi6jC2D2nHdoPfUuSpLGDPIu07HriAvpTpmuohshLqELy3483r5vZfLwfpJf7M82R419+klVjYXO+Pf/cfu+G/BIz7XHRVX10rbuYuCSNpL97cnqqaq7gaPogvGPkpz7FOuXJO2AQQbiSuCNwMNVtbWqHgb2pwvFiQJxC7BvH8f9MnA6QJLD6E453gXcDyxKsluSFwLH9OzzkyR77GxHtqWqfgjcl+S0Vk+SHNlW7wd8py2f0bPbCuAtbfs3AM9qy88HHq2qTwIX0IWjJGlIBhmIG+nuLl01rm1zVT00wfbXAu9rN6EcMsH6MR8FdkuyEbgOWFpVj9ONSO8Dvg5cBKzr2ecy4PYdvammT6cDb0uyAbgDOLm1f5DuVOpaoLe/HwJeneQOulOn32rtC4Hbkqynu874RwOoVZK0Dfn5WUHNJHvOO7TmnfFnoy5Dkobq/mUnPqX9k6ytqgl/x90n1UiShIEoSRJgIEqSBBiIkiQBBqIkSYCBKEkSYCBKkgQYiJIkAQaiJEmAgShJEmAgSpIEGIiSJAEGoiRJgIEoSRJgIEqSBBiIkiQBBqIkSYCBKEkSYCBKkgQYiJIkAQaiJEmAgShJEmAgSpIEGIiSJAEGoiRJgIEoSRJgIEqSBBiIkiQBBqIkSYCBKEkSYCBKkgQYiJIkAQaiJEmAgShJEmAgSpIEGIiSJAEGoiRJgIEoSRIAc0ZdgHbOwgP3Y82yE0ddhiTNGo4QJUnCQJQkCTAQJUkCDERJkgADUZIkwECUJAkwECVJAgxESZIAA1GSJABSVaOuQTshyRbgrlHXMQJzgYdGXcSQ2eddx67Y72H3+UVV9eyJVvjotpnrrqpaPOoihi3Jml2t3/Z517Er9ns69dlTppIkYSBKkgQYiDPZZaMuYER2xX7b513HrtjvadNnb6qRJAlHiJIkAQaiJEmAgTjtJXl9kruS3JPknAnW75nkurZ+dZL5w69yavXR56VJHkyyvn39h1HUOZWS/GWS7yXZtI31SXJR+5ncnuSoYdc41fro8wlJNvd8zucOu8apluSFSf4hydeT3JHkvRNsMxs/6376PfrPu6r8mqZfwO7AN4CDgacBG4DDx23zH4FL2/KbgOtGXfcQ+rwUuGTUtU5xv18NHAVs2sb6Xwc+DwQ4Flg96pqH0OcTgBtGXecU93kecFRb3he4e4I/37Pxs+6n3yP/vB0hTm/HAPdU1b1V9QRwLXDyuG1OBj7elj8D/IskGWKNU62fPs86VbUCeHg7m5wMXFWdVcD+SeYNp7rB6KPPs05Vfbeq1rXlLcCdwIHjNpuNn3U//R45A3F6OxD4p57X3+b//0P0s22q6klgM3DAUKobjH76DPBv2umkzyR54XBKG6l+fy6zzXFJNiT5fJIFoy5mKrXLGy8HVo9bNas/6+30G0b8eRuImon+BphfVS8D/o6fj5A1u6yje+7kkcDFwP8ccT1TJskzgL8CzqqqH466nmGZpN8j/7wNxOntO0Dv6OcFrW3CbZLMAfYDvj+U6gZj0j5X1fer6vH28mPAK4ZU2yj182dhVqmqH1bVj9ry54A9kswdcVlPWZI96ELh6qr67ASbzMrPerJ+T4fP20Cc3r4KHJrkxUmeRnfTzPJx2ywHzmjLpwJ/X+0K9Qw1aZ/HXU85ie56xGy3HPj37Q7EY4HNVfXdURc1SEmeN3Y9PMkxdP9ezeT/7NH68xfAnVX1kW1sNus+6376PR0+b2e7mMaq6skk7wa+QHf35V9W1R1J/hBYU1XL6f6QfSLJPXQ3KLxpdBU/dX32+T1JTgKepOvz0pEVPEWSXEN3l93cJN8GzgP2AKiqS4HP0d19eA/wKPDW0VQ6dfro86nAu5I8CTwGvGmG/2cP4Hjg3wEbk6xvbR8ADoLZ+1nTX79H/nn76DZJkvCUqSRJgIEoSRJgIEqSBBiIkiQBBqIkSYCBKE1bSba2p/7f0R5n9Z+STNnf2TZryPN7Xn8syeFTdOxTptPsFEluTrJ4O+v/W5LXDrMmTT/+HqI0fT1WVYsAkjwH+BTwTLrf1+tLkt2raus2Vi8FNgEPAFTVVE6j9Xt0D02YKS4GLgf+ftSFaHQcIUozQFV9D3gH8O72BJOlSS4ZW5/khiQntOUfJbkwyQa6hyWfm+SrSTYluaztfyqwGLi6jUL37h1FJXlzko1tn/N73udHST7cRqyrkjx3fK1JDgMer6qH2uvT2nE2JFnR2nZPckGr6/Ykv92z//vbe29Isqy1LWrvd3uS65M8q7XfnOT8JLcluTvJq1r73kmuTXJnkuuBvXve98pWz8Ykv9t+vt8EDkjyvCn6yDQDGYjSDFFV99I9vec5k2y6D90cekdW1Vfo5o48uqqOoAuGN1bVZ4A1wOlVtaiqHhvbuZ1GPR94LbAIODrJKT3HXtUewLwCePsE73883YOax5wL/Mu2z9io8W10jyQ7GjgaeHt7XN8b6KY/emXb/k/a9lcB728PdN/IL46S51TVMcBZPe3vAh6tqpe2trHn3S4CDqyqI6pqIXBFz3HWtdq1izIQpdlnK91DlMe8JsnqJBvpQm6yaXWOBm6uqgfblGJX003mC/AEcENbXgvMn2D/ecCDPa9vAa5M8na6QAf4Nbrnda6nmwboAOBQ4HXAFVX1KEBVPZxkP2D/qvpS2/fjPfUAjD0oureeVwOfbMe4Hbi9td8LHJzk4iSvB3pnXPge8Hy0yzIQpRkiycF0Yfc9uue49v793atn+f+OXTdMshfwUeDUNiK6fNy2O+onPc+X3MrE9yE81vseVfVO4A/oZnBYm+QAutngz2yj00VV9eKq+tudrGls5pNt1fMzVfUD4EjgZuCddLOljNmr1a5dlIEozQBJng1cSnf6s4D7gUVJdks3QfIx29h1LJgeSjcX3ak967YA+06wz23AP08yN8nuwJuBL02w3bbcCbykp/ZDqmp1VZ1LN3J8Id3D29+VbkogkhyWZB+6+S3fmuTprf2fVdVm4Adj1wfpHhI9WT0rgLe0YxwBvKwtzwV2q6q/ogvpo3r2OYzuJiPtorzLVJq+9m6nFPegGxF+AhibOucW4D7g63QBtG6iA1TVI0kup/uH/n/TTa815krg0iSPAcf17PPdJOcA/0A3kruxqv56B+peAVyYJC28L0hyaDvW/wI20J3CnA+sSxK6oDylqm5KsghYk+QJupkfPkA3xdmlLSjvZfIZIP4HcEWSO+l+Pmtb+4GtfWww8Pvws7n6XkJ3XVW7KGe7kDTlkvw58DdV9cVR19KPJP8KOKqq/uuoa9HoeMpU0iD8MfD0URexA+YAF466CI2WI0RJknCEKEkSYCBKkgQYiJIkAQaiJEmAgShJEgD/DyGDpKq6m6HIAAAAAElFTkSuQmCC\n" | |
}, | |
"metadata": { | |
"needs_background": "light" | |
} | |
} | |
], | |
"source": [ | |
"\"\"\"\n", | |
"To demonstrate when to use Python Threads we perform an I/O intensive task in sequence vs in parallel using Threads. \n", | |
"Threads are faster. Because of the GIL is released for blocking I/O operations\n", | |
"\"\"\"\n", | |
"from time import time\n", | |
"from threading import Thread\n", | |
"import matplotlib.pyplot as plt\n", | |
"import requests\n", | |
"\n", | |
"\n", | |
"class CustomThread(Thread):\n", | |
" def __init__(self, target):\n", | |
" self.target = target\n", | |
" Thread.__init__(self)\n", | |
"\n", | |
" def run(self):\n", | |
" _ = requests.get(self.target)\n", | |
"\n", | |
"\n", | |
"def make_request_with_threads(endpoints):\n", | |
" start_time = time()\n", | |
" threads = []\n", | |
" for e in endpoints: # unbounded number of threads. This is not good.\n", | |
" thread = CustomThread(e)\n", | |
" thread.start()\n", | |
" threads.append(thread)\n", | |
" # most of the time is spent waiting for the TC socket\n", | |
" for thread in threads:\n", | |
" thread.join() # wait for each thread to finish\n", | |
" total_duration = time() - start_time\n", | |
" return total_duration\n", | |
"\n", | |
"\n", | |
"def make_request_without_threads(endpoints):\n", | |
" start_time = time()\n", | |
" for e in endpoints:\n", | |
" _ = requests.get(e) # most of the time is spent waiting for the TC socket\n", | |
" total_duration = time() - start_time\n", | |
" return total_duration\n", | |
"\n", | |
"\n", | |
"urls = [\"https://google.com\", \"https://youtube.com\", \"https://bbc.co.uk\", \"https://cnn.com\", \"https://nasa.com\",\n", | |
" \"https://yahoo.com\", \"https://reddit.com\"]\n", | |
"duration_without_threads = make_request_without_threads(urls)\n", | |
"duration_with_threads = make_request_with_threads(urls)\n", | |
"\n", | |
"plt.barh([\"Without Threads\", \"With Threads\"], [duration_without_threads, duration_with_threads])\n", | |
"plt.xlabel('Duration (seconds)')\n", | |
"plt.ylabel('Method')\n", | |
"plt.show()\n" | |
] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment