Skip to content

Instantly share code, notes, and snippets.

@ioluwayo
Last active January 5, 2023 08:17
Show Gist options
  • Save ioluwayo/cd5aeacc61744470926f22a060483d59 to your computer and use it in GitHub Desktop.
Save ioluwayo/cd5aeacc61744470926f22a060483d59 to your computer and use it in GitHub Desktop.
Use Threads for IO
Display the source blob
Display the rendered blob
Raw
{
"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": "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\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