{"id":578147,"date":"2025-06-27T14:41:15","date_gmt":"2025-06-27T13:41:15","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=pycharm&#038;p=578147"},"modified":"2025-06-27T14:43:09","modified_gmt":"2025-06-27T13:43:09","slug":"faster-python-concurrency-in-async-await-and-threading","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/ko\/pycharm\/2025\/06\/faster-python-concurrency-in-async-await-and-threading\/","title":{"rendered":"\ub354 \ube60\ub978 Python: async\/await\uc640 threading\uc744 \ud65c\uc6a9\ud55c \ub3d9\uc2dc\uc131"},"content":{"rendered":"<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-578161 size-full\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/PC-social-BlogFeatured-1280x720-2x-24.png\" alt=\"\" width=\"2560\" height=\"1440\" \/><\/figure>\n<p>Python\uc73c\ub85c \ucf54\ub529\ud55c \uacbd\ud5d8\uc774 \uc788\ub2e4\uba74, \ud2b9\ud788 FastAPI\ub098 discord.py \uac19\uc740 \ud504\ub808\uc784\uc6cc\ud06c\ub098 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud574 \ubcf8 \uc801\uc774 \uc788\ub2e4\uba74 <code>async\/await<\/code> \ub610\ub294 <code>asyncio<\/code>\ub97c \uc0ac\uc6a9\ud574 \ubcf4\uc168\uc744 \uac81\ub2c8\ub2e4. \u201cPython\uc758 \uba40\ud2f0\uc2a4\ub808\ub529\uc740 \uc9c4\uc9dc\uac00 \uc544\ub2c8\ub2e4\u201d\ub77c\ub294 \ub9d0\uc744 \ub4e4\uc5b4\ubcf4\uc168\uc744 \uc218\ub3c4 \uc788\uace0, Python\uc758 \uc720\uba85\ud55c(\ud639\uc740 \uc545\uba85 \ub192\uc740) GIL\uc744 \uc54c\uace0 \uacc4\uc2e4 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ucc98\ub7fc Python\uc758 \uba40\ud2f0\uc2a4\ub808\ub529\uc5d0 \ud68c\uc758\uc801\uc778 \uc0c1\ud669\uc5d0\uc11c <code>async\/await<\/code>\uc640 \uba40\ud2f0\uc2a4\ub808\ub529\uc774 \ud2b9\ud788 Python \ud504\ub85c\uadf8\ub798\ubc0d \ucc28\uc6d0\uc5d0\uc11c \uc2e4\uc81c\ub85c \uc5b4\ub5bb\uac8c \ub2e4\ub978\uc9c0 \uad81\uae08\ud558\uc2e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub807\ub2e4\uba74 \uc774 \ube14\ub85c\uadf8 \uae00\uc740 \ubc14\ub85c \uc5ec\ub7ec\ubd84\uc744 \uc704\ud55c \uac83\uc785\ub2c8\ub2e4!<\/p>\n<h2 id=\"what-is-multithreading\" class=\"wp-block-heading\">\uba40\ud2f0\uc2a4\ub808\ub529\uc774\ub780?<\/h2>\n<p>\ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c \uba40\ud2f0\uc2a4\ub808\ub529\uc774\ub780 \ud558\ub098\uc758 \ud504\ub85c\uadf8\ub7a8\uc774 \uc5ec\ub7ec \uac1c\uc758 \uc5f0\uc18d\uc801\uc778 \uc791\uc5c5(\uc989, \uc2a4\ub808\ub4dc)\uc744 \ub3d9\uc2dc\uc5d0 \uc2e4\ud589\ud560 \uc218 \uc788\ub294 \ub2a5\ub825\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc2a4\ub808\ub4dc\ub294 \ub2e8\uc77c \ud504\ub85c\uc138\uc11c \ucf54\uc5b4\uc5d0\uc11c \uc2e4\ud589\ub420 \uc218\ub3c4 \uc788\uace0, \uc5ec\ub7ec \ucf54\uc5b4\uc5d0 \ubd84\uc0b0\ub418\uc5b4 \uc2e4\ud589\ub420 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc Python\uc5d0\uc11c\ub294 Global Interpreter Lock(GIL)\uc758 \uc81c\uc57d \ub54c\ubb38\uc5d0 \uba40\ud2f0\uc2a4\ub808\ub529\uc774 \ub2e8\uc77c \ucf54\uc5b4\uc5d0\uc11c\ub9cc \ucc98\ub9ac\ub429\ub2c8\ub2e4. \uc608\uc678\uc801\uc73c\ub85c GIL\uc744 \uc81c\uac70\ud55c nogil(\uc2a4\ub808\ub4dc \ud504\ub9ac\ub77c\uace0\ub3c4 \ud568) Python\ub3c4 \uc788\uc9c0\ub9cc, \uc774\uc5d0 \ub300\ud574\uc11c\ub294 \uc774 \uc2dc\ub9ac\uc988\uc758 2\ubd80\uc5d0\uc11c \ub2e4\ub8f0 \uc608\uc815\uc785\ub2c8\ub2e4. \uc774 \ube14\ub85c\uadf8 \uae00\uc5d0\uc11c\ub294 GIL\uc774 \ud56d\uc0c1 \uc788\ub2e4\uace0 \uc804\uc81c\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h2 id=\"what-is-concurrency\" class=\"wp-block-heading\">\ub3d9\uc2dc\uc131\uc774\ub780?<\/h2>\n<p>\ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c \ub3d9\uc2dc\uc131\uc774\ub780 \ucef4\ud4e8\ud130\uac00 \ud55c \ubc88\uc5d0 \uc5ec\ub7ec \uc791\uc5c5\uc744 \uc218\ud589\ud558\uac70\ub098, \uc2e4\uc81c\ub85c\ub294 \ub2e8\uc77c \ud504\ub85c\uc138\uc11c\uc5d0\uc11c \uc5ec\ub7ec \uc791\uc5c5\uc774 \ubc88\uac08\uc544 \uc2e4\ud589\ub418\ub354\ub77c\ub3c4 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub294 \uac83\ucc98\ub7fc \ubcf4\uc774\ub294 \uc0c1\ud0dc\ub97c \uc758\ubbf8\ud569\ub2c8\ub2e4. \ud504\ub85c\uadf8\ub7a8\uc758 \uc5ec\ub7ec \uad6c\uc131 \uc694\uc18c \uac04 \ub9ac\uc18c\uc2a4\uc640 \uc0c1\ud638\uc791\uc6a9\uc744 \uad00\ub9ac\ud558\uc5ec \uc11c\ub85c \ub2e4\ub978 \uc791\uc5c5\uc774 \ub3c5\ub9bd\uc801\uc73c\ub85c, \uc2dc\uac04\uc744 \uacb9\uccd0 \uc9c4\ud589\ub420 \uc218 \uc788\uac8c \ud569\ub2c8\ub2e4.<\/p>\n<h3 id=\"both-asyncio-and-threading-appear-concurrent-in-python\" class=\"wp-block-heading\">\ub3d9\uc2dc\uc801\uc73c\ub85c \ubcf4\uc774\ub294 Python\uc758 <code>asyncio<\/code>\uc640 <code>threading<\/code><\/h3>\n<p>\ub300\ub7b5\uc801\uc73c\ub85c \ub9d0\ud558\uc790\uba74, Python\uc758 <code>asyncio<\/code>\uc640 <code>threading<\/code> \ub77c\uc774\ube0c\ub7ec\ub9ac\ub294 \ubaa8\ub450 \ub3d9\uc2dc\uc131\uc774 \uad6c\ud604\ub41c \uac83\ucc98\ub7fc \ubcf4\uc774\ub3c4\ub85d \ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc2e4\uc81c\ub85c CPU\uac00 \uc644\uc804\ud788 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \uc791\uc5c5\uc744 \ucc98\ub9ac\ud558\uace0 \uc788\ub294 \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4. \ub2e8\uc9c0 \uadf8\ub807\uac8c \ubcf4\uc77c \ubfd0\uc774\uc8e0.<\/p>\n<p>\uc190\ub2d8\uc744 \ucd08\ub300\ud574 \uc5ec\ub7ec \ub514\ub108 \ucf54\uc2a4\ub97c \uc900\ube44\ud558\uace0 \uc788\ub2e4\uace0 \uc0c1\uc0c1\ud574 \ubcf4\uc138\uc694. \uc77c\ubd80 \uc694\ub9ac\ub294 \uc870\ub9ac\ud558\ub294 \ub370 \uc2dc\uac04\uc774 \uac78\ub9bd\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc624\ube10\uc5d0\uc11c \uad6c\uc6cc\uc57c \ud558\ub294 \ud30c\uc774\ub098 \uac00\uc2a4\ub808\uc778\uc9c0 \uc704\uc5d0\uc11c \ucc9c\ucc9c\ud788 \ub053\uc5ec\uc57c \ud558\ub294 \uc218\ud504\uac00 \uadf8\ub807\uc2b5\ub2c8\ub2e4. \uc774 \uc694\ub9ac\uac00 \uc644\uc131\ub418\uae30\ub97c \uae30\ub2e4\ub9ac\ub294 \ub3d9\uc548 \uac00\ub9cc\ud788 \uc11c\uc11c \uae30\ub2e4\ub9ac\uae30\ub9cc \ud558\uc9c0\ub294 \uc54a\uc2b5\ub2c8\ub2e4. \uadf8 \uc0ac\uc774\uc5d0 \ub2e4\ub978 \uc77c\uc744 \ucc98\ub9ac\ud569\ub2c8\ub2e4. \uc774\uac83\uc774 \ubc14\ub85c Python\uc758 \ub3d9\uc2dc\uc131\uacfc \uc720\uc0ac\ud569\ub2c8\ub2e4. Python \ud504\ub85c\uc138\uc2a4\uac00 \uc5b4\ub5a4 \uc791\uc5c5\uc774 \uc644\ub8cc\ub418\uae30\ub97c \uae30\ub2e4\ub9ac\uae30\ub294 \uacbd\uc6b0\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc785\ucd9c\ub825(I\/O) \ud504\ub85c\uc138\uc2a4\ub97c \uc6b4\uc601 \uccb4\uc81c\uac00 \ucc98\ub9ac\ud558\uace0 \uc788\uc73c\uba74 Python \ud504\ub85c\uc138\uc2a4\uac00 \uadf8\uc800 \uae30\ub2e4\ub9ac\uace0 \uc788\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub54c async\ub97c \uc0ac\uc6a9\ud558\uba74 \uae30\ub2e4\ub9ac\ub294 \ub3d9\uc548 \ub2e4\ub978 Python \ud504\ub85c\uc138\uc2a4\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-574536\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/image-23.png\" alt=\"Python\uc758 \uba40\ud2f0\uc2a4\ub808\ub529\uacfc asyncio \ube44\uad50\" width=\"1600\" height=\"896\" \/><\/figure>\n<h3 id=\"the-difference-is-who-is-in-charge\" class=\"wp-block-heading\">\uc81c\uc5b4\uc758 \uc8fc\uccb4 \ucc28\uc774<\/h3>\n<p><code>asyncio<\/code>\uc640 <code>threading<\/code>\uc774 \ubaa8\ub450 \ub3d9\uc2dc\uc801\uc73c\ub85c \ubcf4\uc778\ub2e4\uba74 \ub458 \uc0ac\uc774\uc5d0\ub294 \uc5b4\ub5a4 \ucc28\uc774\uac00 \uc788\uc744\uae4c\uc694? \uac00\uc7a5 \ud070 \ucc28\uc774\uc810\uc740 \uc5b8\uc81c \uc5b4\ub5a4 \ud504\ub85c\uc138\uc2a4\ub97c \uc2e4\ud589\ud560\uc9c0 \uacb0\uc815\ud558\ub294 \uc8fc\uccb4\uc5d0 \uc788\uc2b5\ub2c8\ub2e4. <code>async\/await<\/code> \ubc29\uc2dd\uc740 \ub54c\ub54c\ub85c \ud611\ub825\ud615 \ub3d9\uc2dc\uc131\uc774\ub77c\uace0 \ubd88\ub9bd\ub2c8\ub2e4. \ucf54\ub8e8\ud2f4\uc774\ub098 \ud4e8\ucc98\ub294 \uc81c\uc5b4\uad8c\uc744 \ub2e4\ub978 \ucf54\ub8e8\ud2f4\uc774\ub098 \ud4e8\ucc98\uc5d0 \ub118\uaca8, \ub2e4\ub978 \ud504\ub85c\uc138\uc2a4\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ud569\ub2c8\ub2e4. \ubc18\uba74 <code>threading<\/code>\uc5d0\uc11c\ub294 \uc5b4\ub5a4 \ud504\ub85c\uc138\uc2a4\ub97c \uc2e4\ud589\ud560\uc9c0 \uc6b4\uc601 \uccb4\uc81c\uc758 \uad00\ub9ac\uc790\uac00 \uc81c\uc5b4\ud569\ub2c8\ub2e4.<\/p>\n<p>\ud611\ub825\ud615 \ub3d9\uc2dc\uc131\uc740 \ub9c8\uc774\ud06c\ub97c \ub3cc\ub824\uac00\uba70 \ubc1c\uc5b8\ud558\ub294 \ud68c\uc758\uc5d0 \ube44\uc720\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub9c8\uc774\ud06c\ub97c \uac00\uc9c4 \uc0ac\ub78c\uc774 \ub9d0\uc744 \ud558\uace0, \ub354 \uc774\uc0c1 \ud560 \ub9d0\uc774 \uc5c6\uc73c\uba74 \ub2e4\ub978 \uc0ac\ub78c\uc5d0\uac8c \ub9c8\uc774\ud06c\ub97c \ub118\uae30\ub294 \uac83\uc774\uc8e0. \ubc18\uba74, \uba40\ud2f0\uc2a4\ub808\ub529\uc740 \ud68c\uc758 \uc0ac\ud68c\uc790\uac00 \ub204\uac00 \ubc1c\uc5b8\ud560\uc9c0\ub97c \uc9c0\uc815\ud574\uc8fc\ub294 \ubc29\uc2dd\uc785\ub2c8\ub2e4.\u00a0<\/p>\n<h2 id=\"writing-concurrent-code-in-python\" class=\"wp-block-heading\">Python\uc73c\ub85c \ub3d9\uc2dc\uc131 \ucf54\ub4dc \uc791\uc131\ud574 \ubcf4\uae30<\/h2>\n<p>\uc774\uc81c Python\uc5d0\uc11c \ub3d9\uc2dc\uc131\uc774 \uc2e4\uc81c\ub85c \uc5b4\ub5bb\uac8c \ub3d9\uc791\ud558\ub294\uc9c0\ub97c \ud655\uc778\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. <code>asyncio<\/code>\uc640 <code>threading<\/code>\uc744 \ubaa8\ub450 \uc0ac\uc6a9\ud558\uc5ec \ud328\uc2a4\ud2b8\ud478\ub4dc \uc74c\uc2dd\uc810 \uc2dc\ubbac\ub808\uc774\uc158\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h3 id=\"how-async-await-works-in-python\" class=\"wp-block-heading\">Python\uc5d0\uc11c <code>async\/await<\/code>\uc758 \uc791\ub3d9 \ubc29<\/h3>\n<p><code>asyncio<\/code> \ud328\ud0a4\uc9c0\ub294 Python 3.4\uc5d0\uc11c \ub3c4\uc785\ub418\uc5c8\uc73c\uba70, <code>async<\/code>\uc640 <code>await<\/code> \ud0a4\uc6cc\ub4dc\ub294 Python 3.5\uc5d0\uc11c \ub3c4\uc785\ub418\uc5c8\uc2b5\ub2c8\ub2e4. <code>async\/await<\/code>\ub97c \uac00\ub2a5\ud558\uac8c \ud558\ub294 \uc8fc\uc694 \uc694\uc18c \uc911 \ud558\ub098\ub294 \ucf54\ub8e8\ud2f4 \uc0ac\uc6a9\uc785\ub2c8\ub2e4. Python\uc758 \ucf54\ub8e8\ud2f4\uc740 \uc77c\uc2dc \uc911\uc9c0\ud558\uace0 \uba54\uc778 \ud568\uc218\ub85c \uc81c\uc5b4\ub97c \ub2e4\uc2dc \ub118\uae38 \uc218 \uc788\ub3c4\ub85d \uc7ac\uad6c\uc131\ub41c \uc81c\ub108\ub808\uc774\ud130\uc785\ub2c8\ub2e4.<\/p>\n<p>\ud584\ubc84\uac70 \uac00\uac8c\uc5d0 \uadfc\ubb34 \uc911\uc778 \uc9c1\uc6d0\uc774 \ud55c \uba85\ubfd0\uc774\ub77c\uace0 \uac00\uc815\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc8fc\ubb38\uc740 \uc120\uc785\uc120\ucd9c \ubc29\uc2dd\uc758 \ub300\uae30\uc5f4\ub85c \ucc98\ub9ac\ub418\uba70, \ube44\ub3d9\uae30 \uc791\uc5c5\uc740 \uc218\ud589\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import time\n\n\ndef make_burger(order_num):\n    print(f\"Preparing burger #{order_num}...\")\n    time.sleep(5) # time for making the burger\n    print(f\"Burger made #{order_num}\")\n\n\ndef main():\n    for i in range(3):\n        make_burger(i)\n\n\nif __name__ == \"__main__\":\n    s = time.perf_counter()\n    main()\n    elapsed = time.perf_counter() - s\n    print(f\"Orders completed in {elapsed:0.2f} seconds.\")\n<\/pre>\n<p>\uc774 \uc791\uc5c5\uc740 \uc644\ub8cc\ub418\ub294 \ub370 \uc2dc\uac04\uc774 \uc880 \uac78\ub9bd\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Preparing burger #0...\n\nBurger made #0\n\nPreparing burger #1...\n\nBurger made #1\n\nPreparing burger #2...\n\nBurger made #2\n\nOrders completed in 15.01 seconds.<\/pre>\n<p>\uc774\uc81c \uac00\uac8c\uc5d0 \uc9c1\uc6d0\uc774 \ub354 \ub298\uc5b4\ub098\uc11c, \uc5ec\ub7ec \uc791\uc5c5\uc744 \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4\uace0 \uac00\uc815\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import asyncio\n\nimport time\n\nasync def make_burger(order_num):\n\n\u00a0\u00a0\u00a0\u00a0print(f\"Preparing burger #{order_num}...\")\n\n\u00a0\u00a0\u00a0\u00a0await asyncio.sleep(5) # time for making the burger\n\n\u00a0\u00a0\u00a0\u00a0print(f\"Burger made #{order_num}\")\n\nasync def main():\n\n\u00a0\u00a0\u00a0\u00a0order_queue = []\n\n\u00a0\u00a0\u00a0\u00a0for i in range(3):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0order_queue.append(make_burger(i))\n\n\u00a0\u00a0\u00a0\u00a0await asyncio.gather(*(order_queue))\n\nif __name__ == \"__main__\":\n\n\u00a0\u00a0\u00a0\u00a0s = time.perf_counter()\n\n\u00a0\u00a0\u00a0\u00a0asyncio.run(main())\n\n\u00a0\u00a0\u00a0\u00a0elapsed = time.perf_counter() - s\n\n\u00a0\u00a0\u00a0\u00a0print(f\"Orders completed in {elapsed:0.2f} seconds.\")<\/pre>\n<p>\ub450 \ubc29\uc2dd\uc758 \ucc28\uc774\uac00 \ub69c\ub837\ud574\uc9d1\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Preparing burger #0...\n\nPreparing burger #1...\n\nPreparing burger #2...\n\nBurger made #0\n\nBurger made #1\n\nBurger made #2\n\nOrders completed in 5.00 seconds.<\/pre>\n<p><code>asyncio<\/code>\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 <code>run<\/code>\uacfc <code>gather<\/code> \uac19\uc740 \ud568\uc218, \uadf8\ub9ac\uace0 <code>async<\/code>\uc640 <code>await<\/code> \ud0a4\uc6cc\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ud584\ubc84\uac70\ub97c \ub3d9\uc2dc\uc5d0 \ub9cc\ub4e4 \uc218 \uc788\ub294 \ucf54\ub8e8\ud2f4\uc744 \uc0dd\uc131\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc81c \ud55c \uac78\uc74c \ub354 \ub098\uc544\uac00 \uc880 \ub354 \ubcf5\uc7a1\ud55c \uc2dc\ubbac\ub808\uc774\uc158\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc9c1\uc6d0\uc774 \ub450 \uba85\ubfd0\uc774\ub77c\uc11c \ud55c \ubc88\uc5d0 \ud584\ubc84\uac70\ub97c \ub450 \uac1c\ub9cc \ub9cc\ub4e4 \uc218 \uc788\ub2e4\uace0 \uac00\uc815\ud574 \ubd05\uc2dc\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import asyncio\n\nimport time\n\norder_queue = asyncio.Queue()\n\ndef take_order():\n\n\u00a0\u00a0for i in range(3):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0order_queue.put_nowait(make_burger(i))\n\nasync def make_burger(order_num):\n\n\u00a0\u00a0print(f\"Preparing burger #{order_num}...\")\n\n\u00a0\u00a0await asyncio.sleep(5)\u00a0 # time for making the burger\n\n\u00a0\u00a0print(f\"Burger made #{order_num}\")\n\nclass Staff:\n\n\u00a0\u00a0def __init__(self, name):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0self.name = name\n\n\u00a0\u00a0async def working(self):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0while order_queue.qsize() &gt; 0:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"{self.name} is working...\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task = await order_queue.get()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await task\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"{self.name} finished a task...\")\n\nasync def main():\n\n\u00a0\u00a0staff1 = Staff(name=\"John\")\n\n\u00a0\u00a0staff2 = Staff(name=\"Jane\")\n\n\u00a0\u00a0take_order()\n\n\u00a0\u00a0await asyncio.gather(staff1.working(), staff2.working())\n\nif __name__ == \"__main__\":\n\n\u00a0\u00a0s = time.perf_counter()\n\n\u00a0\u00a0asyncio.run(main())\n\n\u00a0\u00a0elapsed = time.perf_counter() - s\n\n\u00a0\u00a0print(f\"Orders completed in {elapsed:0.2f} seconds.\")<\/pre>\n<p>\ub300\uae30\uc5f4\uc744 \uc0ac\uc6a9\ud574 \uc791\uc5c5\uc744 \ubcf4\ub958\uc2dc\ud0a4\uba74 \uc9c1\uc6d0\ub4e4\uc774 \uc791\uc5c5\uc744 \ud558\ub098\uc529 \uac00\uc838\uac00 \ucc98\ub9ac\ud558\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">John is working...\n\nPreparing burger #0...\n\nJane is working...\n\nPreparing burger #1...\n\nBurger made #0\n\nJohn finished a task...\n\nJohn is working...\n\nPreparing burger #2...\n\nBurger made #1\n\nJane finished a task...\n\nBurger made #2\n\nJohn finished a task...\n\nOrders completed in 10.00 seconds.<\/pre>\n<p>\uc774 \uc608\uc2dc\uc5d0\uc11c\ub294 <code>asyncio.Queue<\/code>\ub97c \uc791\uc5c5 \uc800\uc7a5\uc6a9\uc73c\ub85c \uc0ac\uc6a9\ud558\uc9c0\ub9cc, \ub2e4\uc74c \uc608\uc2dc\ucc98\ub7fc \uc5ec\ub7ec \uc885\ub958\uc758 \uc791\uc5c5\uc774 \uc788\ub294 \uacbd\uc6b0\uc5d0 \ub354 \ub2e4\uc591\ud558\uac8c \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import asyncio\n\nimport time\n\ntask_queue = asyncio.Queue()\n\norder_num = 0\n\nasync def take_order():\n\n\u00a0\u00a0\u00a0global order_num\n\n\u00a0\u00a0\u00a0order_num += 1\n\n\u00a0\u00a0\u00a0print(f\"Order burger and fries for order #{order_num:04d}:\")\n\n\u00a0\u00a0\u00a0burger_num = input(\"Number of burgers:\")\n\n\u00a0\u00a0\u00a0for i in range(int(burger_num)):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await task_queue.put(make_burger(f\"{order_num:04d}-burger{i:02d}\"))\n\n\u00a0\u00a0\u00a0fries_num = input(\"Number of fries:\")\n\n\u00a0\u00a0\u00a0for i in range(int(fries_num)):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await task_queue.put(make_fries(f\"{order_num:04d}-fries{i:02d}\"))\n\n\u00a0\u00a0\u00a0print(f\"Order #{order_num:04d} queued.\")\n\n\u00a0\u00a0\u00a0await task_queue.put(take_order())\n\nasync def make_burger(order_num):\n\n\u00a0\u00a0\u00a0print(f\"Preparing burger #{order_num}...\")\n\n\u00a0\u00a0\u00a0await asyncio.sleep(5)\u00a0 # time for making the burger\n\n\u00a0\u00a0\u00a0print(f\"Burger made #{order_num}\")\n\nasync def make_fries(order_num):\n\n\u00a0\u00a0\u00a0print(f\"Preparing fries #{order_num}...\")\n\n\u00a0\u00a0\u00a0await asyncio.sleep(2)\u00a0 # time for making fries\n\n\u00a0\u00a0\u00a0print(f\"Fries made #{order_num}\")\n\nclass Staff:\n\n\u00a0\u00a0\u00a0def __init__(self, name):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0self.name = name\n\n\u00a0\u00a0\u00a0async def working(self):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0while True:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if task_queue.qsize() &gt; 0:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"{self.name} is working...\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task = await task_queue.get()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await task\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"{self.name} finish task...\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await asyncio.sleep(1) #rest\n\nasync def main():\n\n\u00a0\u00a0\u00a0task_queue.put_nowait(take_order())\n\n\u00a0\u00a0\u00a0staff1 = Staff(name=\"John\")\n\n\u00a0\u00a0\u00a0staff2 = Staff(name=\"Jane\")\n\n\u00a0\u00a0\u00a0await asyncio.gather(staff1.working(), staff2.working())\n\nif __name__ == \"__main__\":\n\n\u00a0\u00a0\u00a0s = time.perf_counter()\n\n\u00a0\u00a0\u00a0asyncio.run(main())\n\n\u00a0\u00a0\u00a0elapsed = time.perf_counter() - s\n\n\u00a0\u00a0\u00a0print(f\"Orders completed in {elapsed:0.2f} seconds.\")<\/pre>\n<p>\uc774 \uc608\uc2dc\uc5d0\ub294 \uc5ec\ub7ec \uac1c\uc758 \uc791\uc5c5\uc774 \uc788\uc73c\uba70, \uac10\uc790\ud280\uae40 \ub9cc\ub4e4\uae30\ucc98\ub7fc \uc2dc\uac04\uc774 \uc801\uac8c \uac78\ub9ac\ub294 \uc77c\ub3c4 \uc788\uace0, \uc8fc\ubb38 \ubc1b\uae30\ucc98\ub7fc \uc0ac\uc6a9\uc790\uc758 \uc785\ub825\uc774 \ud544\uc694\ud55c \uc77c\ub3c4 \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.\u00a0<\/p>\n<p>\uc8fc\ubaa9\ud560 \uc810\uc740 \ud504\ub85c\uadf8\ub7a8\uc774 \uc0ac\uc6a9\uc790 \uc785\ub825\uc744 \uae30\ub2e4\ub9ac\uba74\uc11c \uba48\ucd94\uace0, \uc8fc\ubb38\uc744 \ubc1b\uc9c0 \uc54a\ub294 \ub2e4\ub978 \uc9c1\uc6d0\uae4c\uc9c0\ub3c4 \ub4a4\uc5d0\uc11c \uc791\uc5c5\uc744 \uba48\ucd98\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \uc774\ub294 <code>input<\/code> \ud568\uc218\uac00 \ube44\ub3d9\uae30\uac00 \uc544\ub2c8\uae30 \ub54c\ubb38\uc5d0 await\ud560 \uc218 \uc5c6\uc5b4\uc11c\uc785\ub2c8\ub2e4. \ube44\ub3d9\uae30 \ucf54\ub4dc\uc5d0\uc11c\ub294 await\ub420 \ub54c\uc5d0\ub9cc \uc81c\uc5b4\uad8c\uc774 \ud574\uc81c\ub41c\ub2e4\ub294 \uc810\uc744 \uae30\uc5b5\ud558\uc138\uc694. \uc774 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub824\uba74 \ub2e4\uc74c \ucf54\ub4dc\ub97c<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">input(\"Number of burgers:\")<\/pre>\n<p>\ub2e4\uc74c\uc73c\ub85c \ubc14\uafc9\ub2c8\ub2e4.\u00a0<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">await asyncio.to_thread(input, \"Number of burgers:\")<\/pre>\n<p>\uac10\uc790\ud280\uae40\uc5d0\ub3c4 \ub611\uac19\uc774 \uc801\uc6a9\ud569\ub2c8\ub2e4. \uc544\ub798 \ucf54\ub4dc\ub97c \ucc38\uace0\ud558\uc138\uc694. \ud604\uc7ac \ud504\ub85c\uadf8\ub7a8\uc740 \ubb34\ud55c \ub8e8\ud504\ub85c \uc2e4\ud589\ub418\ubbc0\ub85c \uc911\uc9c0\ud558\ub824\uba74 \uc77c\ubd80\ub7ec \uc798\ubabb \uc785\ub825\ud558\uc5ec \ud504\ub85c\uadf8\ub7a8\uc744 \uc885\ub8cc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import asyncio\n\nimport time\n\ntask_queue = asyncio.Queue()\n\norder_num = 0\n\nasync def take_order():\n\n\u00a0\u00a0\u00a0global order_num\n\n\u00a0\u00a0\u00a0order_num += 1\n\n\u00a0\u00a0\u00a0print(f\"Order burger and fries for order #{order_num:04d}:\")\n\n\u00a0\u00a0\u00a0burger_num = await asyncio.to_thread(input, \"Number of burgers:\")\n\n\u00a0\u00a0\u00a0for i in range(int(burger_num)):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await task_queue.put(make_burger(f\"{order_num:04d}-burger{i:02d}\"))\n\n\u00a0\u00a0\u00a0fries_num = await asyncio.to_thread(input, \"Number of fries:\")\n\n\u00a0\u00a0\u00a0for i in range(int(fries_num)):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await task_queue.put(make_fries(f\"{order_num:04d}-fries{i:02d}\"))\n\n\u00a0\u00a0\u00a0print(f\"Order #{order_num:04d} queued.\")\n\n\u00a0\u00a0\u00a0await task_queue.put(take_order())\n\nasync def make_burger(order_num):\n\n\u00a0\u00a0\u00a0print(f\"Preparing burger #{order_num}...\")\n\n\u00a0\u00a0\u00a0await asyncio.sleep(5)\u00a0 # time for making the burger\n\n\u00a0\u00a0\u00a0print(f\"Burger made #{order_num}\")\n\nasync def make_fries(order_num):\n\n\u00a0\u00a0\u00a0print(f\"Preparing fries #{order_num}...\")\n\n\u00a0\u00a0\u00a0await asyncio.sleep(2)\u00a0 # time for making fries\n\n\u00a0\u00a0\u00a0print(f\"Fries made #{order_num}\")\n\nclass Staff:\n\n\u00a0\u00a0\u00a0def __init__(self, name):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0self.name = name\n\n\u00a0\u00a0\u00a0async def working(self):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0while True:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if task_queue.qsize() &gt; 0:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"{self.name} is working...\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task = await task_queue.get()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await task\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"{self.name} finish task...\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await asyncio.sleep(1) #rest\n\nasync def main():\n\n\u00a0\u00a0\u00a0task_queue.put_nowait(take_order())\n\n\u00a0\u00a0\u00a0staff1 = Staff(name=\"John\")\n\n\u00a0\u00a0\u00a0staff2 = Staff(name=\"Jane\")\n\n\u00a0\u00a0\u00a0await asyncio.gather(staff1.working(), staff2.working())\n\nif __name__ == \"__main__\":\n\n\u00a0\u00a0\u00a0s = time.perf_counter()\n\n\u00a0\u00a0\u00a0asyncio.run(main())\n\n\u00a0\u00a0\u00a0elapsed = time.perf_counter() - s\n\n\u00a0\u00a0\u00a0print(f\"Orders completed in {elapsed:0.2f} seconds.\")<\/pre>\n<p><code>asyncio.to_thread<\/code>\ub97c \uc0ac\uc6a9\ud558\uc5ec <code>input<\/code> \ud568\uc218\ub97c \ubcc4\ub3c4\uc758 \uc2a4\ub808\ub4dc\uc5d0 \ubc30\uce58\ud588\uc2b5\ub2c8\ub2e4(<a href=\"https:\/\/docs.python.org\/3\/library\/asyncio-task.html#running-in-threads\" target=\"_blank\" rel=\"noopener\">\uc774 \ubb38\uc11c \ucc38\uc870<\/a>). \ub2e8, \uc774 \ubc29\uc2dd\uc740 Python GIL\uc774 \uc788\uc744 \ub54c\uc5d0\ub9cc I\/O \ubc14\uc6b4\ub4dc \uc791\uc5c5\uc744 \ube14\ub85c\ud0b9 \ud574\uc81c\ud560 \uc218 \uc788\ub2e4\ub294 \uc810\uc5d0 \uc720\uc758\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc704 \ucf54\ub4dc\ub97c \uc2e4\ud589\ud574 \ubcf4\uba74, \ud130\ubbf8\ub110\uc758 \ud45c\uc900 I\/O\uac00 \ub4a4\uc11e\uc5ec \ucd9c\ub825\ub418\ub294 \uac83\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc0ac\uc6a9\uc790 I\/O\uc640 \ud504\ub85c\uadf8\ub7a8 \uc2e4\ud589 \uae30\ub85d\uc740 \ubd84\ub9ac\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc2e4\ud589 \uae30\ub85d\uc740 \ub85c\uadf8\ub85c \uc800\uc7a5\ud574 \ub450\uc5c8\ub2e4\uac00 \ub098\uc911\uc5d0 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\u00a0<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import asyncio\n\nimport logging\n\nimport time\n\nlogger = logging.getLogger(__name__)\n\nlogging.basicConfig(filename='pyburger.log', level=logging.INFO)\n\ntask_queue = asyncio.Queue()\n\norder_num = 0\n\nclosing = False\n\nasync def take_order():\n\n\u00a0\u00a0\u00a0global order_num, closing\n\n\u00a0\u00a0\u00a0try:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0order_num += 1\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logger.info(f\"Taking Order #{order_num:04d}...\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"Order burger and fries for order #{order_num:04d}:\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0burger_num = await asyncio.to_thread(input, \"Number of burgers:\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for i in range(int(burger_num)):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await task_queue.put(make_burger(f\"{order_num:04d}-burger{i:02d}\"))\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fries_num = await asyncio.to_thread(input, \"Number of fries:\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for i in range(int(fries_num)):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await task_queue.put(make_fries(f\"{order_num:04d}-fries{i:02d}\"))\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logger.info(f\"Order #{order_num:04d} queued.\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"Order #{order_num:04d} queued, please wait.\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await task_queue.put(take_order())\n\n\u00a0\u00a0\u00a0except ValueError:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(\"Goodbye!\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logger.info(\"Closing down... stop taking orders and finish all tasks.\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0closing = True\n\nasync def make_burger(order_num):\n\n\u00a0\u00a0\u00a0logger.info(f\"Preparing burger #{order_num}...\")\n\n\u00a0\u00a0\u00a0await asyncio.sleep(5)\u00a0 # time for making the burger\n\n\u00a0\u00a0\u00a0logger.info(f\"Burger made #{order_num}\")\n\nasync def make_fries(order_num):\n\n\u00a0\u00a0\u00a0logger.info(f\"Preparing fries #{order_num}...\")\n\n\u00a0\u00a0\u00a0await asyncio.sleep(2)\u00a0 # time for making fries\n\n\u00a0\u00a0\u00a0logger.info(f\"Fries made #{order_num}\")\n\nclass Staff:\n\n\u00a0\u00a0\u00a0def __init__(self, name):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0self.name = name\n\n\u00a0\u00a0\u00a0async def working(self):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0while True:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if task_queue.qsize() &gt; 0:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logger.info(f\"{self.name} is working...\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task = await task_queue.get()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await task\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task_queue.task_done()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logger.info(f\"{self.name} finish task.\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0elif closing:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await asyncio.sleep(1) #rest\n\nasync def main():\n\n\u00a0\u00a0\u00a0global task_queue\n\n\u00a0\u00a0\u00a0task_queue.put_nowait(take_order())\n\n\u00a0\u00a0\u00a0staff1 = Staff(name=\"John\")\n\n\u00a0\u00a0\u00a0staff2 = Staff(name=\"Jane\")\n\n\u00a0\u00a0\u00a0print(\"Welcome to Pyburger!\")\n\n\u00a0\u00a0\u00a0logger.info(\"Ready for business!\")\n\n\u00a0\u00a0\u00a0await asyncio.gather(staff1.working(), staff2.working())\n\n\u00a0\u00a0\u00a0logger.info(\"All tasks finished. Closing now.\")\n\nif __name__ == \"__main__\":\n\n\u00a0\u00a0\u00a0s = time.perf_counter()\n\n\u00a0\u00a0\u00a0asyncio.run(main())\n\n\u00a0\u00a0\u00a0elapsed = time.perf_counter() - s\n\n\u00a0\u00a0\u00a0logger.info(f\"Orders completed in {elapsed:0.2f} seconds.\")<\/pre>\n<p>\ub9c8\uc9c0\ub9c9 \ucf54\ub4dc \ube14\ub85d\uc5d0\uc11c\ub294 \uc2dc\ubbac\ub808\uc774\uc158 \uc815\ubcf4\ub97c <code>pyburger.log<\/code>\uc5d0 \uae30\ub85d\ud558\uace0, \ud130\ubbf8\ub110\uc740 \uace0\uac1d \uba54\uc2dc\uc9c0\uc6a9\uc73c\ub85c\ub9cc \ub450\uc5c8\uc2b5\ub2c8\ub2e4. \ub610\ud55c \uc8fc\ubb38 \uacfc\uc815 \uc911\uc5d0 \uc798\ubabb\ub41c \uc785\ub825\uc774 \ubc1c\uc0dd\ud558\uba74 \uc774\ub97c \ud3ec\ucc29\ud558\uc5ec, \uc0ac\uc6a9\uc790\uac00 \uc885\ub8cc\ub97c \uc6d0\ud55c\ub2e4\uace0 \uac00\uc815\ud558\uace0 <code>closing<\/code> \ud50c\ub798\uadf8\ub97c <code>True<\/code>\ub85c \uc804\ud658\ud569\ub2c8\ub2e4. <code>closing<\/code> \ud50c\ub798\uadf8\uac00 <code>True<\/code>\ub85c \uc124\uc815\ub418\uba74, \uc9c1\uc6d0\uc740 <code>return<\/code>\uc744 \uc2e4\ud589\ud558\uc5ec \ucf54\ub8e8\ud2f4\uc758 \ubb34\ud55c <code>while<\/code> \ub8e8\ud504\ub97c \uc885\ub8cc\ud569\ub2c8\ub2e4.<\/p>\n<h3 id=\"how-does-threading-work-in-python\" class=\"wp-block-heading\">Python\uc5d0\uc11c <code>threading<\/code>\uc758 \uc791\ub3d9 \ubc29\uc2dd<\/h3>\n<p>\uc704\uc758 \uc608\uc2dc\uc5d0\uc11c\ub294 I\/O \ubc14\uc6b4\ub4dc \uc791\uc5c5\uc744 \ubcc4\ub3c4\uc758 \uc2a4\ub808\ub4dc\uc5d0 \ubc30\uce58\ud588\uc2b5\ub2c8\ub2e4. \uadf8\ub7f0\ub370 \ubaa8\ub4e0 \uc791\uc5c5\uc744 \uac01\uac01\uc758 \uc2a4\ub808\ub4dc\uc5d0 \ub123\uace0 \ub3d9\uc2dc\uc5d0 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218\ub294 \uc5c6\uc744\uae4c\uc694? \uc774\ubc88\uc5d0\ub294 <code>asyncio<\/code> \ub300\uc2e0 <code>threading<\/code>\uc744 \uc0ac\uc6a9\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc544\ub798\uc5d0 \ub098\uc640 \uc788\ub294 \ucf54\ub4dc\ucc98\ub7fc \uc544\ubb34\ub7f0 \uc81c\ud55c \uc5c6\uc774 \ud584\ubc84\uac70\ub97c \ub3d9\uc2dc\uc5d0 \ub9cc\ub4dc\ub294 \uad6c\uc870\ub97c \uc0dd\uac01\ud574 \ubd05\uc2dc\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import asyncio\n\nimport time\n\nasync def make_burger(order_num):\n\n\u00a0\u00a0\u00a0\u00a0print(f\"Preparing burger #{order_num}...\")\n\n\u00a0\u00a0\u00a0\u00a0await asyncio.sleep(5) # time for making the burger\n\n\u00a0\u00a0\u00a0\u00a0print(f\"Burger made #{order_num}\")\n\nasync def main():\n\n\u00a0\u00a0\u00a0\u00a0order_queue = []\n\n\u00a0\u00a0\u00a0\u00a0for i in range(3):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0order_queue.append(make_burger(i))\n\n\u00a0\u00a0\u00a0\u00a0await asyncio.gather(*(order_queue))\n\nif __name__ == \"__main__\":\n\n\u00a0\u00a0\u00a0\u00a0s = time.perf_counter()\n\n\u00a0\u00a0\u00a0\u00a0asyncio.run(main())\n\n\u00a0\u00a0\u00a0\u00a0elapsed = time.perf_counter() - s\n\n\u00a0\u00a0\u00a0\u00a0print(f\"Orders completed in {elapsed:0.2f} seconds.\")\n\n```\n\nInstead of creating async coroutines to make the burgers, we can just send functions down different threads like this:\n\n```\n\nimport threading\n\nimport time\n\ndef make_burger(order_num):\n\n\u00a0\u00a0\u00a0print(f\"Preparing burger #{order_num}...\")\n\n\u00a0\u00a0\u00a0time.sleep(5) # time for making the burger\n\n\u00a0\u00a0\u00a0print(f\"Burger made #{order_num}\")\n\ndef main():\n\n\u00a0\u00a0\u00a0order_queue = []\n\n\u00a0\u00a0\u00a0for i in range(3):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task = threading.Thread(target=make_burger, args=(i,))\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0order_queue.append(task)\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task.start()\n\n\u00a0\u00a0\u00a0for task in order_queue:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task.join()\n\nif __name__ == \"__main__\":\n\n\u00a0\u00a0\u00a0s = time.perf_counter()\n\n\u00a0\u00a0\u00a0main()\n\n\u00a0\u00a0\u00a0elapsed = time.perf_counter() - s\n\n\u00a0\u00a0\u00a0print(f\"Orders completed in {elapsed:0.2f} seconds.\")<\/pre>\n<p><code>main<\/code> \ud568\uc218\uc758 \uccab \ubc88\uc9f8 <code>for<\/code> \ub8e8\ud504\uc5d0\uc11c\ub294, \uac01 \uc791\uc5c5\uc774 \uc11c\ub85c \ub2e4\ub978 \uc2a4\ub808\ub4dc\uc5d0\uc11c \uc0dd\uc131\ub418\uc5b4 \uc2e4\ud589\ub418\uae30 \uc2dc\uc791\ud569\ub2c8\ub2e4. \ub450 \ubc88\uc9f8 <code>for<\/code> \ub8e8\ud504\ub294 \ud504\ub85c\uadf8\ub7a8\uc774 \uadf8 \ub2e4\uc74c \ub2e8\uacc4\ub85c \ub118\uc5b4\uac00\uae30 \uc804\uc5d0(\uc989, <code>main<\/code>\uc73c\ub85c \ub3cc\uc544\uac00\uae30 \uc804\uc5d0) \ubaa8\ub4e0 \ud584\ubc84\uac70\uac00 \uc81c\uc791 \uc644\ub8cc\ub418\ub3c4\ub85d \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc9c1\uc6d0\uc774 \ub450 \uba85\ubfd0\uc77c \uacbd\uc6b0\uc5d0\ub294 \uc0c1\ud669\uc774 \ub354 \ubcf5\uc7a1\ud574\uc9d1\ub2c8\ub2e4. \uc9c1\uc6d0 \uac01\uac01\uc740 \ud558\ub098\uc758 \uc2a4\ub808\ub4dc\ub85c \ud45c\ud604\ub418\uba70, \ubaa8\ub4e0 \uc791\uc5c5\uc774 \uc800\uc7a5\ub41c \uc77c\ubc18 \ubaa9\ub85d\uc5d0\uc11c \uc791\uc5c5\uc744 \uac00\uc838\uac11\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import threading\n\nimport time\n\norder_queue = []\n\ndef take_order():\n\n\u00a0\u00a0\u00a0for i in range(3):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0order_queue.append(make_burger(i))\n\ndef make_burger(order_num):\n\n\u00a0\u00a0\u00a0def making_burger():\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"Preparing burger #{order_num}...\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0time.sleep(5)\u00a0 # time for making the burger\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"Burger made #{order_num}\")\n\n\u00a0\u00a0\u00a0return making_burger\n\ndef working():\n\n\u00a0\u00a0\u00a0\u00a0\u00a0while len(order_queue) &gt; 0:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"{threading.current_thread().name} is working...\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task = order_queue.pop(0)\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"{threading.current_thread().name} finish task...\")\n\ndef main():\n\n\u00a0\u00a0\u00a0take_order()\n\n\u00a0\u00a0\u00a0staff1 = threading.Thread(target=working, name=\"John\")\n\n\u00a0\u00a0\u00a0staff1.start()\n\n\u00a0\u00a0\u00a0staff2 = threading.Thread(target=working, name=\"Jane\")\n\n\u00a0\u00a0\u00a0staff2.start()\n\n\u00a0\u00a0\u00a0staff1.join()\n\n\u00a0\u00a0\u00a0staff2.join()\n\nif __name__ == \"__main__\":\n\n\u00a0s = time.perf_counter()\n\n\u00a0main()\n\n\u00a0elapsed = time.perf_counter() - s\n\n\u00a0print(f\"Orders completed in {elapsed:0.2f} seconds.\")<\/pre>\n<p>\uc704 \ucf54\ub4dc\ub97c \uc2e4\ud589\ud558\uba74 \ube48 \ubaa9\ub85d\uc5d0\uc11c \uc791\uc5c5\uc744 \uac00\uc838\uc624\ub824 \ud55c\ub2e4\ub294 \uba54\uc2dc\uc9c0\uc640 \ud568\uaed8 \uc624\ub958\uac00 \ud55c \uc2a4\ub808\ub4dc\uc5d0\uc11c \ubc1c\uc0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <code>task_queue<\/code>\uac00 \ube44\uc5b4 \uc788\uc9c0 \uc54a\uc744 \ub54c\ub9cc <code>while<\/code> \ub8e8\ud504\uac00 \uacc4\uc18d \uc2e4\ud589\ub418\ub3c4\ub85d \uc870\uac74\uc744 \uac78\uc5b4\ub450\uc5c8\ub294\ub370 \uc65c \uc774\ub7f0 \uc624\ub958\uac00 \ubc1c\uc0dd\ud558\ub294\uc9c0 \uad81\uae08\ud558\uc2e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8 \uc774\uc720\ub294 \uacbd\uc7c1 \uc870\uac74\uc774 \ubc1c\uc0dd\ud588\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/p>\n<h3 id=\"race-conditions\" class=\"wp-block-heading\">\uacbd\uc7c1 \uc870\uac74<\/h3>\n<p>\uacbd\uc7c1 \uc870\uac74\uc740 \uc5ec\ub7ec \uc2a4\ub808\ub4dc\uac00 \ub3d9\uc2dc\uc5d0 \ub3d9\uc77c\ud55c \ub9ac\uc18c\uc2a4\ub098 \ub370\uc774\ud130\uc5d0 \uc561\uc138\uc2a4\ud558\ub824\uace0 \ud560 \ub54c \ubc1c\uc0dd\ud558\uba70 \uc2dc\uc2a4\ud15c\uc5d0 \ubb38\uc81c\ub97c \uc77c\uc73c\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub9ac\uc18c\uc2a4\uc5d0 \uc811\uadfc\ud558\ub294 \ud0c0\uc774\ubc0d\uacfc \uc21c\uc11c\ub294 \ud504\ub85c\uadf8\ub7a8 \ub85c\uc9c1\uc5d0 \uc911\uc694\ud558\uba70, \uc5ec\ub7ec \uc2a4\ub808\ub4dc\uac00 \uc608\uce21\ud560 \uc218 \uc5c6\ub294 \ud0c0\uc774\ubc0d\uc5d0 \ub610\ub294 \uc11c\ub85c \uacb9\uccd0\uc11c \uacf5\uc720 \ub370\uc774\ud130\uc5d0 \uc561\uc138\uc2a4\ud558\uac70\ub098 \uc774\ub97c \uc218\uc815\ud558\uba74 \uc624\ub958\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \uacbd\uc7c1 \uc870\uac74\uc744 \ud574\uacb0\ud558\uae30 \uc704\ud574 <code>task_queue<\/code>\uc5d0 lock\uc744 \ub123\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">queue_lock = threading.Lock()<\/pre>\n<p>\uc791\uc5c5\uc744 \uc218\ud589\ud558\ub824\uba74, \ub300\uae30\uc5f4\uc758 \uae38\uc774\ub97c \ud655\uc778\ud558\uac70\ub098 \uc791\uc5c5\uc744 \uac00\uc838\uc62c \ub54c \ud574\ub2f9 \ub300\uae30\uc5f4\uc5d0 \uc561\uc138\uc2a4\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. \ud55c \uc2a4\ub808\ub4dc\uc5d0 \uc561\uc138\uc2a4 \uad8c\ud55c\uc774 \uc788\ub294 \ub3d9\uc548\uc5d0\ub294 \ub2e4\ub978 \uc2a4\ub808\ub4dc\uac00 \ud574\ub2f9 \ub300\uae30\uc5f4\uc5d0 \uc561\uc138\uc2a4\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">def working():\n\n\u00a0\u00a0\u00a0while True:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0with queue_lock:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if len(order_queue) == 0:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task = order_queue.pop(0)\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"{threading.current_thread().name} is working...\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"{threading.current_thread().name} finish task...\")\n\n```\n\nBased on what we have learned so far, we can complete our final code with threading like this:\n\n```\n\nimport logging\n\nimport threading\n\nimport time\n\nlogger = logging.getLogger(__name__)\n\nlogging.basicConfig(filename=\"pyburger_threads.log\", level=logging.INFO)\n\nqueue_lock = threading.Lock()\n\ntask_queue = []\n\norder_num = 0\n\nclosing = False\n\ndef take_order():\n\n\u00a0\u00a0\u00a0global order_num, closing\n\n\u00a0\u00a0\u00a0try:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0order_num += 1\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logger.info(f\"Taking Order #{order_num:04d}...\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"Order burger and fries for order #{order_num:04d}:\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0burger_num = input(\"Number of burgers:\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for i in range(int(burger_num)):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0with queue_lock:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task_queue.append(make_burger(f\"{order_num:04d}-burger{i:02d}\"))\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fries_num = input(\"Number of fries:\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for i in range(int(fries_num)):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0with queue_lock:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task_queue.append(make_fries(f\"{order_num:04d}-fries{i:02d}\"))\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logger.info(f\"Order #{order_num:04d} queued.\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f\"Order #{order_num:04d} queued, please wait.\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0with queue_lock:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task_queue.append(take_order)\n\n\u00a0\u00a0\u00a0except ValueError:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(\"Goodbye!\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logger.info(\"Closing down... stop taking orders and finish all tasks.\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0closing = True\n\ndef make_burger(order_num):\n\n\u00a0\u00a0\u00a0def making_burger():\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logger.info(f\"Preparing burger #{order_num}...\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0time.sleep(5)\u00a0 # time for making the burger\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logger.info(f\"Burger made #{order_num}\")\n\n\u00a0\u00a0\u00a0return making_burger\n\ndef make_fries(order_num):\n\n\u00a0\u00a0\u00a0def making_fries():\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logger.info(f\"Preparing fried #{order_num}...\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0time.sleep(2)\u00a0 # time for making fries\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logger.info(f\"Fries made #{order_num}\")\n\n\u00a0\u00a0\u00a0return making_fries\n\ndef working():\n\n\u00a0\u00a0\u00a0while True:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0with queue_lock:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if len(task_queue) == 0:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if closing:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task = None\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task = task_queue.pop(0)\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if task:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logger.info(f\"{threading.current_thread().name} is working...\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logger.info(f\"{threading.current_thread().name} finish task...\")\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0time.sleep(1)\u00a0 # rest\n\ndef main():\n\n\u00a0\u00a0\u00a0print(\"Welcome to Pyburger!\")\n\n\u00a0\u00a0\u00a0logger.info(\"Ready for business!\")\n\n\u00a0\u00a0\u00a0task_queue.append(take_order)\n\n\u00a0\u00a0\u00a0staff1 = threading.Thread(target=working, name=\"John\")\n\n\u00a0\u00a0\u00a0staff1.start()\n\n\u00a0\u00a0\u00a0staff2 = threading.Thread(target=working, name=\"Jane\")\n\n\u00a0\u00a0\u00a0staff2.start()\n\n\u00a0\u00a0\u00a0staff1.join()\n\n\u00a0\u00a0\u00a0staff2.join()\n\n\u00a0\u00a0\u00a0logger.info(\"All tasks finished. Closing now.\")\n\nif __name__ == \"__main__\":\n\n\u00a0\u00a0\u00a0s = time.perf_counter()\n\n\u00a0\u00a0\u00a0main()\n\n\u00a0\u00a0\u00a0elapsed = time.perf_counter() - s\n\n\u00a0\u00a0\u00a0logger.info(f\"Orders completed in {elapsed:0.2f} seconds.\")<\/pre>\n<p><code>asyncio<\/code>\uc640 <code>threading<\/code>\uc744 \uc0ac\uc6a9\ud55c \ub450 \ucf54\ub4dc \uc2a4\ub2c8\ud3ab\uc744 \ube44\uad50\ud574 \ubcf4\uba74 \uacb0\uacfc\ub294 \ube44\uc2b7\ud569\ub2c8\ub2e4. \uadf8\ub7ec\uba74 \ub354 \ub098\uc740 \uac83\uc740 \ubb34\uc5c7\uc774\uace0, \ub458 \uc911 \ud558\ub098\ub97c \uc120\ud0dd\ud574\uc57c \ud558\ub294 \uc774\uc720\ub294 \ubb34\uc5c7\uc77c\uae4c\uc694?<\/p>\n<p>\uc2e4\uc6a9\uc801\uc778 \uad00\uc810\uc5d0\uc11c \ubcf4\uba74 <code>asyncio<\/code> \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uac83\uc774 \uba40\ud2f0\uc2a4\ub808\ub529\ubcf4\ub2e4 \ub354 \uc27d\uc2b5\ub2c8\ub2e4. \uacbd\uc7c1 \uc870\uac74\uc774\ub098 \uad50\ucc29 \uc0c1\ud0dc \uac19\uc740 \ubb38\uc81c\ub97c \uc2e0\uacbd \uc4f8 \ud544\uc694\uac00 \uc5c6\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. \uc81c\uc5b4\uac00 \uae30\ubcf8\uc801\uc73c\ub85c \ucf54\ub8e8\ud2f4 \uac04\uc5d0 \uc804\ub2ec\ub418\uae30 \ub54c\ubb38\uc5d0 lock\uc774 \ud544\uc694 \uc5c6\uc2b5\ub2c8\ub2e4. \ubc18\uba74, Python \uc2a4\ub808\ub4dc\ub294 \ubcd1\ub82c \uc2e4\ud589\uc774 \uac00\ub2a5\ud558\uc9c0\ub9cc, GIL\uc774 \uc788\ub294 \ud55c \ub300\ubd80\ubd84\uc758 \uacbd\uc6b0\uc5d0\ub294 \uc2e4\uc81c\ub85c \ubcd1\ub82c\ub85c \uc2e4\ud589\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc774\uc5d0 \ub300\ud574\uc11c\ub294 \ub2e4\uc74c \ube14\ub85c\uadf8 \uae00\uc5d0\uc11c nogil(\uc2a4\ub808\ub4dc \ud504\ub9ac) Python\uc744 \ub2e4\ub8f0 \ub54c \ub2e4\uc2dc \uc774\uc57c\uae30\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h2 id=\"benefiting-from-concurrency\" class=\"wp-block-heading\">\ub3d9\uc2dc\uc131\uc758 \uc774\uc810<\/h2>\n<p>\ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c \uc65c \ub3d9\uc2dc\uc131\uc744 \uc0ac\uc6a9\ud574\uc57c \ud560\uae4c\uc694? \ubc14\ub85c \uc18d\ub3c4 \ub54c\ubb38\uc785\ub2c8\ub2e4. \uc55e\uc11c \uc0b4\ud3b4\ubcf8 \uac83\ucc98\ub7fc \ub300\uae30 \uc2dc\uac04\uc744 \uc904\uc774\uba74 \uc804\uccb4 \uc791\uc5c5\uc744 \ub354 \ube60\ub974\uac8c \ub05d\ub0bc \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ucef4\ud4e8\ud305\uc5d0\ub294 \ub2e4\uc591\ud55c \ud615\ud0dc\uc758 \ub300\uae30 \uc2dc\uac04\uc774 \uc788\uc73c\uba70, \uac01\uac01\uc758 \uacbd\uc6b0\uc5d0 \ub530\ub77c \uc2dc\uac04\uc744 \uc808\uc57d\ud558\uae30 \uc704\ud574 \uc11c\ub85c \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<h3 id=\"i-o-bound-tasks\" class=\"wp-block-heading\">I\/O \ubc14\uc6b4\ub4dc \uc791\uc5c5<\/h3>\n<p>\uc791\uc5c5 \ub610\ub294 \ud504\ub85c\uadf8\ub7a8\uc774 I\/O \ubc14\uc6b4\ub4dc\ub77c\uace0 \ud560 \uc218 \uc788\ub294 \uacbd\uc6b0\ub294 \ud574\ub2f9 \uc791\uc5c5\uc758 \uc2e4\ud589 \uc18d\ub3c4\uac00 \uae30\ubcf8\uc801\uc73c\ub85c \ud30c\uc77c\uc774\ub098 \ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \uc77d\uc5b4\uc624\uac70\ub098 \uc0ac\uc6a9\uc790 \uc785\ub825\uc744 \ub300\uae30\ud558\ub294 \ub4f1\uc758 \uc785\ucd9c\ub825\uc744 \ucc98\ub9ac\ud558\ub294 \uc18d\ub3c4\ub85c \uc81c\ud55c\ub418\ub294 \uacbd\uc6b0\uc785\ub2c8\ub2e4. I\/O \ucc98\ub9ac\ub294 \uc77c\ubc18\uc801\uc73c\ub85c CPU \ucc98\ub9ac\ubcf4\ub2e4 \ub290\ub9ac\ubbc0\ub85c I\/O\uac00 \ub9ce\uc740 \uc791\uc5c5\uc740 \uc0c1\ub2f9\ud788 \uc624\ub798 \uac78\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc791\uc5c5\uc758 \ub300\ud45c\uc801\uc778 \uc608\ub85c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ub370\uc774\ud130 \uc77d\uc5b4\uc624\uae30, \uc6f9 \uc694\uccad \ucc98\ub9ac, \ub300\uc6a9\ub7c9 \ud30c\uc77c \uc791\uc5c5 \ub4f1\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><code>async\/await<\/code> \ub3d9\uc2dc\uc131\uc744 \uc0ac\uc6a9\ud558\uba74 \ucc98\ub9ac \ud750\ub984\uc744 \ube14\ub85c\ud0b9 \ud574\uc81c\ud558\uace0 \ub300\uae30\ud558\ub294 \ub3d9\uc548 \ub2e4\ub978 \uc791\uc5c5\uc774 \ucc98\ub9ac\ub418\ub3c4\ub85d \ud558\uc5ec, I\/O \ubc14\uc6b4\ub4dc \uc791\uc5c5 \uc911 \ubc1c\uc0dd\ud558\ub294 \ub300\uae30 \uc2dc\uac04\uc744 \ucd5c\uc801\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><code>async\/await<\/code> \ub3d9\uc2dc\uc131\uc740 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640\uc758 \ud1b5\uc2e0\uc774\ub098 \uc6f9 \uc694\uccad \ucc98\ub9ac\uac00 \ub9ce\uc740 \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub4f1\uc758 \uc5ec\ub7ec Python \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc720\uc6a9\ud558\uac8c \ud65c\uc6a9\ub429\ub2c8\ub2e4. GUI(\uadf8\ub798\ud53d \uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4)\uc5d0\uc11c\ub3c4 <code>async\/await<\/code> \ub3d9\uc2dc\uc131\uc744 \ud65c\uc6a9\ud558\uba74 \uc0ac\uc6a9\uc790\uac00 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uacfc \uc0c1\ud638\uc791\uc6a9\ud558\ub294 \ub3d9\uc548 \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc791\uc5c5\uc774 \uc2e4\ud589\ub418\ub3c4\ub85d \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3 id=\"cpu-bound-tasks\" class=\"wp-block-heading\">CPU \ubc14\uc6b4\ub4dc \uc791\uc5c5<\/h3>\n<p>\uc791\uc5c5\uc774\ub098 \ud504\ub85c\uadf8\ub7a8\uc774 CPU \ubc14\uc6b4\ub4dc\ub77c\uace0 \ud560 \uc218 \uc788\ub294 \uacbd\uc6b0\ub294 \uc2e4\ud589 \uc18d\ub3c4\uac00 \uae30\ubcf8\uc801\uc73c\ub85c CPU\uc758 \ucc98\ub9ac \uc18d\ub3c4\ub85c \uc81c\ud55c\ub420 \ub54c\uc785\ub2c8\ub2e4. \ub300\ud45c\uc801\uc778 \uc608\ub85c\ub294 \uc774\ubbf8\uc9c0 \ub610\ub294 \ub3d9\uc601\uc0c1 \ucc98\ub9ac(\uc608: \ud06c\uae30 \ubcc0\uacbd, \ud3b8\uc9d1)\uc640 \ud589\ub82c \uacf1\uc148\uc774\ub098 \uba38\uc2e0\ub7ec\ub2dd \ubaa8\ub378 \ud2b8\ub808\uc774\ub2dd\uacfc \uac19\uc740 \ubcf5\uc7a1\ud55c \uc218\uce58 \uacc4\uc0b0 \uc791\uc5c5\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>I\/O \ubc14\uc6b4\ub4dc \uc791\uc5c5\uacfc \ub2ec\ub9ac, CPU \ubc14\uc6b4\ub4dc \uc791\uc5c5\uc740 CPU\uac00 \uc774\ubbf8 \ud574\ub2f9 \uc791\uc5c5\uc744 \ucc98\ub9ac\ud558\ub294 \ub370 \uc0ac\uc6a9\ub418\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 <code>async\/await<\/code> \ub3d9\uc2dc\uc131\uc73c\ub85c\ub294 \uac70\uc758 \ucd5c\uc801\ud654\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc2dc\uc2a4\ud15c\uc5d0 CPU\uac00 \ub450 \uac1c \uc774\uc0c1 \uc788\uac70\ub098 \uc77c\ubd80 \uc791\uc5c5\uc744 \ud558\ub098 \uc774\uc0c1\uc758 GPU\ub85c \uc624\ud504\ub85c\ub4dc\ud560 \uc218 \uc788\ub2e4\uba74, \uc2a4\ub808\ub4dc\ub97c \ub298\ub9ac\uace0 \uba40\ud2f0\ud504\ub85c\uc138\uc2f1\uc744 \uc218\ud589\ud558\uc5ec CPU \ubc14\uc6b4\ub4dc \uc791\uc5c5\uc744 \ub354 \ube60\ub974\uac8c \uc644\ub8cc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uba40\ud2f0\ud504\ub85c\uc138\uc2f1\uc740 CPU\uc640 GPU\uc758 \ud65c\uc6a9\uc744 \ucd5c\uc801\ud654\ud560 \uc218 \uc788\uc73c\uba70, \uc774\ub294 \uc694\uc998 \ub9ce\uc740 \uba38\uc2e0\ub7ec\ub2dd \ubc0f AI \ubaa8\ub378\uc774 \uc5ec\ub7ec GPU\uc5d0\uc11c \ud2b8\ub808\uc774\ub2dd\ub418\ub294 \uc774\uc720\uc774\uae30\ub3c4 \ud569\ub2c8\ub2e4.<\/p>\n<p>\uadf8\ub7ec\ub098 \uc774\ub294 \uc21c\uc218 Python \ucf54\ub4dc\ub9cc\uc73c\ub85c\ub294 \uc218\ud589\ud558\uae30 \uc5b4\ub835\uc2b5\ub2c8\ub2e4. Python \uc790\uccb4\uac00 \uc0ac\uc6a9\uc790\uac00 \uc800\uc218\uc900 \ucef4\ud4e8\ud305 \ud504\ub85c\uc138\uc2a4\ub97c \uc9c1\uc811 \uc81c\uc5b4\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub418\ub3c4\ub85d \ucd94\uc0c1\ud654\ub41c \uacc4\uce35 \uad6c\uc870\ub85c \uc124\uacc4\ub418\uc5c8\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. \uac8c\ub2e4\uac00 Python\uc758 GIL\uc740 \ud558\ub098\uc758 \ucef4\ud4e8\ud130\uc5d0\uc11c \uc5ec\ub7ec \uc2a4\ub808\ub4dc\uac00 Python \ub9ac\uc18c\uc2a4\ub97c \uacf5\uc720\ud558\ub294 \uac83\uc744 \uc81c\ud55c\ud569\ub2c8\ub2e4. \ucd5c\uadfc Python 3.13\uc5d0\uc11c\ub294 GIL\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc774 \ub3c4\uc785\ub418\uc5b4 \uc9c4\uc815\ud55c \uba40\ud2f0\uc2a4\ub808\ub529\uc774 \uac00\ub2a5\ud574\uc84c\uc2b5\ub2c8\ub2e4. GIL\uacfc \uc774\ub97c \uc81c\uac70\ud558\uace0 \uc2e4\ud589\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574\uc11c\ub294 \ub2e4\uc74c \ube14\ub85c\uadf8 \uae00\uc5d0\uc11c \uc790\uc138\ud788 \ub2e4\ub8e8\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uacbd\uc6b0\uc5d0 \ub530\ub77c \uc704\uc5d0\uc11c \uc18c\uac1c\ud55c \ubc29\ubc95\uc73c\ub85c\ub3c4 CPU \ubc14\uc6b4\ub4dc \uc791\uc5c5\uc758 \uc18d\ub3c4\ub97c \ucda9\ubd84\ud788 \ub04c\uc5b4\uc62c\ub9ac\uc9c0 \ubabb\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7f4 \uacbd\uc6b0, CPU \ubc14\uc6b4\ub4dc \uc791\uc5c5\uc744 \ub354 \uc138\ubd80\uc801\uc73c\ub85c \ub098\ub208 \ub4a4, \uc5ec\ub7ec \uc2a4\ub808\ub4dc, \uc5ec\ub7ec \ud504\ub85c\uc138\uc11c \ub610\ub294 \uc5ec\ub7ec \ub300\uc758 \ucef4\ud4e8\ud130\uc5d0 \ubd84\uc0b0\ud574 \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ud574\uc57c \ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 \ubcd1\ub82c \ucc98\ub9ac\uc5d0 \ud574\ub2f9\ud558\uba70, \uc774\ub97c \uad6c\ud604\ud558\ub824\uba74 \ucf54\ub4dc\ub97c \ucc98\uc74c\ubd80\ud130 \ub2e4\uc2dc \uc791\uc131\ud574\uc57c \ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. Python\uc5d0\uc11c\ub294 <code>multiprocessing<\/code> \ud328\ud0a4\uc9c0\ub97c \ud1b5\ud574 \ub85c\uceec \ubc0f \uc6d0\uaca9 \ub3d9\uc2dc\uc131\uc744 \ubaa8\ub450 \uad6c\ud604\ud560 \uc218 \uc788\uc73c\uba70, \uc774\ub97c \ud65c\uc6a9\ud558\uba74 GIL\uc758 \uc81c\uc57d\uc744 \uc6b0\ud68c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\uc640 \uad00\ub828\ub41c \uc608\uc2dc\ub294 \ub2e4\uc74c \ube14\ub85c\uadf8 \uae00\uc5d0\uc11c \ud568\uaed8 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h2 id=\"debugging-concurrent-code-in-py-charm\" class=\"wp-block-heading\">PyCharm\uc758 \ub3d9\uc2dc\uc131 \ucf54\ub4dc \ub514\ubc84\uadf8<\/h2>\n<p>\ube44\ub3d9\uae30 \ub610\ub294 \ub3d9\uc2dc\uc131 \ucf54\ub4dc\ub294 \ud504\ub85c\uadf8\ub7a8\uc774 \uc21c\ucc28\uc801\uc73c\ub85c \uc2e4\ud589\ub418\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uc5b8\uc81c \uc5b4\ub514\uc5d0\uc11c \ucf54\ub4dc\uac00 \uc2e4\ud589\ub418\uace0 \uc788\ub294\uc9c0 \ud30c\uc545\ud558\uae30 \uc5b4\ub824\uc6cc\uc11c \ub514\ubc84\uadf8\ud558\uae30\uac00 \uae4c\ub2e4\ub86d\uc2b5\ub2c8\ub2e4. \ub9ce\uc740 \uac1c\ubc1c\uc790\ub4e4\uc774 \ucf54\ub4dc \ud750\ub984\uc744 \ucd94\uc801\ud558\uae30 \uc704\ud574 <code>print<\/code>\ub97c \uc0ac\uc6a9\ud558\uc9c0\ub9cc, \uc774 \ubc29\ubc95\uc740 \ub9e4\uc6b0 \uae4c\ub2e4\ub85c\uc6b8 \ubfd0\ub9cc \uc544\ub2c8\ub77c \ub3d9\uc2dc\uc131\ucc98\ub7fc \ubcf5\uc7a1\ud55c \ud504\ub85c\uadf8\ub7a8\uc744 \uc870\uc0ac\ud560 \ub54c \uc0ac\uc6a9\ud558\uae30 \uc27d\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uad8c\uc7a5\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uac8c\ub2e4\uac00 \uc9c0\uc800\ubd84\ud574\uc11c \ub098\uc911\uc5d0 \uc815\ub9ac\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\ub300\ubd80\ubd84\uc758 IDE\ub294 \ud504\ub85c\uadf8\ub7a8\uc758 \ubcc0\uc218\uc640 \ud750\ub984\uc744 \uac80\uc0ac\ud558\ub294 \ub370 \uc801\ud569\ud55c \ub514\ubc84\uac70\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \ub610\ud55c \ub514\ubc84\uac70\ub294 \uc5ec\ub7ec \uc2a4\ub808\ub4dc\uc5d0 \uac78\uccd0 \uba85\ud655\ud55c \uc2a4\ud0dd \ucd94\uc801\uc744 \uc218\ud589\ud569\ub2c8\ub2e4. <a href=\"https:\/\/www.jetbrains.com\/pycharm\/\" target=\"_blank\" rel=\"noopener\" data-type=\"link\" data-id=\"https:\/\/www.jetbrains.com\/pycharm\/data-science\/\">PyCharm<\/a>\uc73c\ub85c \uc74c\uc2dd\uc810\uc744 \uc2dc\ubbac\ub808\uc774\uc158\ud55c \uc774 \uc608\uc2dc\uc5d0\uc11c <code>task_queue<\/code>\ub97c \uc5b4\ub5bb\uac8c \ucd94\uc801\ud560 \uc218 \uc788\ub294\uc9c0 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uba3c\uc800 \ucf54\ub4dc\uc5d0 \uba87 \uac1c\uc758 \uc911\ub2e8\uc810\uc744 \uc124\uc815\ud558\uaca0\uc2b5\ub2c8\ub2e4. \ub514\ubc84\uac70\ub97c \uc77c\uc2dc \uc911\uc9c0\uc2dc\ud0ac \uc704\uce58\uc758 \uc904 \ubc88\ud638\ub97c \ud074\ub9ad\ud558\uba74 \uc911\ub2e8\uc810\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\uba74 \uc911\ub2e8\uc810\uc774 \uc124\uc815\ub418\uc5c8\uc74c\uc744 \ub098\ud0c0\ub0b4\ub294 \ube68\uac04 \uc810\uc774 \uc904 \ubc88\ud638\uc5d0 \ud45c\uc2dc\ub429\ub2c8\ub2e4. <code>task_queue<\/code>\uac00 \uc11c\ub85c \ub2e4\ub978 \uc2a4\ub808\ub4dc\uc5d0\uc11c \ubcc0\uacbd\ub418\ub294 \uc704\uce58\uc778 23\ubc88, 27\ubc88, 65\ubc88 \uc904\uc5d0 \uc911\ub2e8\uc810\uc744 \uc124\uc815\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-574369\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/image-8.png\" alt=\"\" width=\"1600\" height=\"720\" \/><\/figure>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-574380\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/image-9.png\" alt=\"\" width=\"1600\" height=\"554\" \/><\/figure>\n<p>\uadf8\ub7f0 \ub2e4\uc74c, \uc624\ub978\ucabd \uc0c1\ub2e8\uc5d0 \uc788\ub294 \uc791\uc740 \ubc8c\ub808 \ubaa8\uc591 \uc544\uc774\ucf58\uc744 \ud074\ub9ad\ud558\uba74 \ub514\ubc84\uadf8 \ubaa8\ub4dc\ub85c \ud504\ub85c\uadf8\ub7a8\uc744 \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-574391\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/image-10.png\" alt=\"\" width=\"860\" height=\"258\" \/><\/figure>\n<p>\uc544\uc774\ucf58\uc744 \ud074\ub9ad\ud558\uba74 <em>Debug(\ub514\ubc84\uadf8)<\/em> \ucc3d\uc774 \uc5f4\ub9bd\ub2c8\ub2e4. \ud504\ub85c\uadf8\ub7a8\uc740 \ucf54\ub4dc\uc5d0\uc11c \uac15\uc870 \ud45c\uc2dc\ub41c \uccab \ubc88\uc9f8 \uc911\ub2e8\uc810\uc5d0 \ub3c4\ub2ec\ud560 \ub54c\uae4c\uc9c0 \uc2e4\ud589\ub429\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-574402\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/image-11.png\" alt=\"\" width=\"1600\" height=\"1002\" \/><\/figure>\n<p>\uc5ec\uae30\uc11c\ub294 <code>John<\/code> \uc2a4\ub808\ub4dc\uac00 \uc791\uc5c5\uc744 \uac00\uc838\uac00\ub824\ub294 \uc911\uc774\uba70, 65\ubc88 \uc904\uc774 \uac15\uc870 \ud45c\uc2dc\ub418\uc5b4 \uc788\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc2dc\uc810\uc5d0\ub294 \uac15\uc870 \ud45c\uc2dc\ub41c \uc904\uc774 \uc544\uc9c1 \uc2e4\ud589\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \uc774 \ubc29\ubc95\uc740 \uc911\ub2e8\uc810\uc5d0 \uc9c4\uc785\ud558\uae30 \uc804\uc5d0 \ubcc0\uc218\ub97c \uac80\uc0ac\ud558\uace0 \uc2f6\uc744 \ub54c \uc720\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<p><code>task_queue<\/code>\uc5d0 \uc5b4\ub5a4 \uac12\uc774 \ub4e4\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc544\ub798\uc640 \uac19\uc774 <em>Debug(\ub514\ubc84\uadf8)<\/em> \ucc3d\uc5d0 \uc785\ub825\uc744 \uc2dc\uc791\ud558\uba74 \uac04\ub2e8\ud558\uac8c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-574414\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/image-12.png\" alt=\"\" width=\"1600\" height=\"468\" \/><\/figure>\n<p>\u201ctask_queue\u201d\ub97c \uc120\ud0dd\ud558\uac70\ub098 \uc9c1\uc811 \uc785\ub825\ud55c \ub4a4 <code>Enter<\/code>\ub97c \ub204\ub974\uc138\uc694. <code>take_order<\/code> \uc791\uc5c5\uc774 \ub300\uae30\uc5f4\uc5d0 \ub4e4\uc5b4 \uc788\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-574425\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/image-13.png\" alt=\"\" width=\"1600\" height=\"527\" \/><\/figure>\n<p>\uc774\uc81c \uc544\ub798\uc640 \uac19\uc774 <em>Step in(\uc2a4\ud15d\uc778)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc5ec \uc911\ub2e8\uc810\uc744 \uc2e4\ud589\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-574436\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/image-14.png\" alt=\"\" width=\"1274\" height=\"488\" \/><\/figure>\n<p>\ud574\ub2f9 \ubc84\ud2bc\uc744 \ub204\ub978 \ub4a4 \ub098\ud0c0\ub098\ub294 <em>Special Variables(\ud2b9\uc218 \ubcc0\uc218)<\/em> \ucc3d\uc744 \ubcf4\uba74, <code>John<\/code> \uc2a4\ub808\ub4dc\uc5d0\uc11c task \ubcc0\uc218\uac00 <code>take_order<\/code>\uc778 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-574447\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/image-15.png\" alt=\"\" width=\"1600\" height=\"522\" \/><\/figure>\n<p><code>task_queue<\/code>\ub97c \ub2e4\uc2dc \uac80\uc0c9\ud574 \ubcf4\uba74, \uc774\uc81c \ubaa9\ub85d\uc774 \ube44\uc5b4 \uc788\uc74c\uc744 \uc54c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-574458\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/image-16.png\" alt=\"\" width=\"1600\" height=\"451\" \/><\/figure>\n<p>\uc774\uc81c <em>Resume Program(\ud504\ub85c\uadf8\ub7a8 \uc7ac\uac1c)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc5ec \ud504\ub85c\uadf8\ub7a8\uc744 \uacc4\uc18d \uc2e4\ud589\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-574469\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/image-17.png\" alt=\"\" width=\"994\" height=\"610\" \/><\/figure>\n<p>\ud504\ub85c\uadf8\ub7a8\uc774 \uc0ac\uc6a9\uc790 \uc785\ub825 \ubd80\ubd84\uc5d0 \ub3c4\ub2ec\ud558\uba74, PyCharm\uc774 <em>Console(\ucf58\uc194)<\/em> \ucc3d\uc744 \ud45c\uc2dc\ud558\uc5ec \uc0ac\uc6a9\uc790\uac00 \uc785\ub825\uc744 \uc81c\uacf5\ud560 \uc218 \uc788\ub3c4\ub85d \ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \ud584\ubc84\uac70 \ub450 \uac1c\ub97c \uc8fc\ubb38\ud55c\ub2e4\uace0 \uac00\uc815\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \u201c2\u201d\ub97c \uc785\ub825\ud55c \ub2e4\uc74c <em>Enter<\/em>\ub97c \ub204\ub974\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-574480\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/image-18.png\" alt=\"\" width=\"1288\" height=\"616\" \/><\/figure>\n<p>\uc774\uc81c \ub450 \ubc88\uc9f8 \uc911\ub2e8\uc810\uc5d0 \ub3c4\ub2ec\ud588\uc2b5\ub2c8\ub2e4. <em>Threads &amp; Variables(\uc2a4\ub808\ub4dc \ubc0f \ubcc0\uc218)<\/em> \ucc3d\uc73c\ub85c \ub2e4\uc2dc \ub3cc\uc544\uac00\uba74, <code>burger_num<\/code> \uac12\uc774 \uc6b0\ub9ac\uac00 \uc785\ub825\ud55c \ub300\ub85c 2\ub85c \uc124\uc815\ub418\uc5b4 \uc788\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-574491\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/image-19.png\" alt=\"\" width=\"1600\" height=\"1002\" \/><\/figure>\n<p>\uc774\uc81c \uc774\uc804\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c \uc911\ub2e8\uc810\uc744 \ub530\ub77c \ub4e4\uc5b4\uac00 <code>task_queue<\/code>\ub97c \ud655\uc778\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. <code>make_burger<\/code> \uc791\uc5c5\uc774 \ud558\ub098 \ucd94\uac00\ub41c \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-574502\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/image-20.png\" alt=\"\" width=\"1600\" height=\"405\" \/><\/figure>\n<p>\ud504\ub85c\uadf8\ub7a8\uc744 \ub2e4\uc2dc \uc2e4\ud589\ud55c \ub4a4, \uc911\ub2e8 \uc2dc\uc810\uc5d0\uc11c \uc911\ub2e8\uc810\uc5d0 \ub4e4\uc5b4\uac00 \ubcf4\uba74 <code>Jane<\/code>\uc774 \uc791\uc5c5\uc744 \uac00\uc838\uac00\uace0 \uc788\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-574513\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/image-21.png\" alt=\"\" width=\"1600\" height=\"1002\" \/><\/figure>\n<p>\ub098\uba38\uc9c0 \ucf54\ub4dc\ub294 \uc9c1\uc811 \uc0b4\ud3b4\ubcf4\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4. \uc791\uc5c5\uc774 \ub05d\ub098\uba74, \ucc3d \uc0c1\ub2e8\uc5d0 \uc788\ub294 \ube68\uac04\uc0c9 <em>Stop(\uc911\uc9c0)<\/em> \ubc84\ud2bc\uc744 \ub204\ub974\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-574524\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/image-22.png\" alt=\"\" width=\"848\" height=\"244\" \/><\/figure>\n<p>PyCharm\uc758 \ub514\ubc84\uac70\ub97c \uc0ac\uc6a9\ud558\uba74 \uc5ec\ub7ec \uc2a4\ub808\ub4dc\uc5d0 \uac78\uccd0 \ud504\ub85c\uadf8\ub7a8\uc758 \uc2e4\ud589\uc744 \ub530\ub77c\uac00\uace0, \ub2e4\uc591\ud55c \ubcc0\uc218\ub97c \ub9e4\uc6b0 \uc27d\uac8c \uac80\uc0ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<h2 id=\"conclusion\" class=\"wp-block-heading\">\uacb0\ub860<\/h2>\n<p>\uc9c0\uae08\uae4c\uc9c0 Python\uc758 \ub3d9\uc2dc\uc131\uc5d0 \ub300\ud574 \uae30\ubcf8\uc801\uc778 \ub0b4\uc6a9\uc744 \uc0b4\ud3b4\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \uc774\ub97c \uc5f0\uc2b5\ud558\uc5ec \uc644\ubcbd\ud558\uac8c \ub2e4\ub8e8\uac8c \ub418\uc2dc\uae38 \ubc14\ub78d\ub2c8\ub2e4. \ub2e4\uc74c \ube14\ub85c\uadf8 \uae00\uc5d0\uc11c\ub294 Python GIL\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uace0, \uadf8 \uc5ed\ud560\uacfc GIL\uc774 \uc5c6\uc744 \ub54c \ub2ec\ub77c\uc9c0\ub294 \uc810\ub3c4 \ud568\uaed8 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>PyCharm\uc740 \ub3d9\uc2dc\uc131 Python \ucf54\ub4dc \uc791\uc5c5\uc5d0 \uac15\ub825\ud55c \ub3c4\uad6c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774 \ube14\ub85c\uadf8\uc5d0\uc11c \uc18c\uac1c\ud55c \uac83\ucc98\ub7fc PyCharm\uc758 \ub514\ubc84\uac70\ub97c \uc0ac\uc6a9\ud558\uba74 \ube44\ub3d9\uae30 \ucf54\ub4dc\uc640 \uc2a4\ub808\ub4dc \ucf54\ub4dc \ubaa8\ub450\ub97c \ub2e8\uacc4\ubcc4\ub85c \uac80\uc0ac\ud558\uace0, \uc2e4\ud589 \ud750\ub984\uc744 \ucd94\uc801\ud558\uace0, \uacf5\uc720 \ub9ac\uc18c\uc2a4\ub97c \ubaa8\ub2c8\ud130\ub9c1\ud558\uba70, \ubb38\uc81c\ub97c \ube60\ub974\uac8c \ud0d0\uc9c0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. PyCharm\uc740 \uc9c1\uad00\uc801\uc778 \uc911\ub2e8\uc810, \uc2e4\uc2dc\uac04 \ubcc0\uc218 \ubdf0, \uc0ac\uc6a9\uc790 \uc785\ub825\uc744 \uc704\ud55c \ub9e4\ub044\ub7ec\uc6b4 \ucf58\uc194 \ud1b5\ud569, \uac15\ub825\ud55c \ub85c\uae45 \uc9c0\uc6d0\uc744 \ud1b5\ud574 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc790\uc2e0 \uc788\uace0 \uba85\ud655\ud558\uace0 \uc27d\uac8c \uc791\uc131 \ubc0f \ud14c\uc2a4\ud2b8\ud558\uace0, \ub514\ubc84\uadf8\ud560 \uc218 \uc788\ub3c4\ub85d \ub3d5\uc2b5\ub2c8\ub2e4.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/ko-kr\/pycharm\/\" target=\"_blank\" rel=\"noopener\">PyCharm \uc9c0\uae08 \ub2e4\uc6b4\ub85c\ub4dc<\/a><\/div>\n<\/div>\n<div>\u00a0<\/div>\n<div>\u00a0<\/div>\n<div><em>\uac8c\uc2dc\ubb3c \uc6d0\ubb38 \uc791\uc131\uc790<\/em><\/div>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/CheukTingHo-Kimono-e1738750639162-200x200.jpg\" width=\"200\" height=\"200\" alt=\"Cheuk Ting Ho\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Cheuk Ting Ho<\/h4>\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1191,"featured_media":578161,"comment_status":"closed","ping_status":"closed","template":"","categories":[1401,2347,8377],"tags":[6939,5377],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/pycharm\/578147"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/users\/1191"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/comments?post=578147"}],"version-history":[{"count":7,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/pycharm\/578147\/revisions"}],"predecessor-version":[{"id":578213,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/pycharm\/578147\/revisions\/578213"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media\/578161"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media?parent=578147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/categories?post=578147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/tags?post=578147"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/cross-post-tag?post=578147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}