<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>threading</title>
	<atom:link href="https://techgrowup.net/tag/threading/feed/" rel="self" type="application/rss+xml" />
	<link>https://techgrowup.net</link>
	<description>エンジニアを強くする</description>
	<lastBuildDate>Sun, 29 Dec 2024 16:17:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://techgrowup.net/wp-content/uploads/2021/05/hp-icon-150x150.png</url>
	<title>threading</title>
	<link>https://techgrowup.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Python開発入門56 Pythonのthreadingモジュール入門！スレッドで効率的な並行処理を学ぶ</title>
		<link>https://techgrowup.net/python-threading/</link>
					<comments>https://techgrowup.net/python-threading/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Sun, 29 Dec 2024 16:17:03 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[threading]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=2269</guid>

					<description><![CDATA[はじめに Pythonのthreadingモジュールは、軽量な並行処理を実現するための標準ライブラリです。スレッドを使用することで、複数のタスクを同時に実行し、プログラムのパフォーマンスを向上させることが可能です。 この [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading"><strong>はじめに</strong></h1>



<p>Pythonの<strong>threadingモジュール</strong>は、軽量な並行処理を実現するための標準ライブラリです。スレッドを使用することで、複数のタスクを同時に実行し、プログラムのパフォーマンスを向上させることが可能です。</p>



<p>この記事では、スレッドの基本的な使い方から、より高度な制御方法までを初心者向けに解説します。</p>



<h2 class="wp-block-heading"><strong>threadingモジュールとは</strong></h2>



<h3 class="wp-block-heading"><strong>threadingモジュールの概要</strong></h3>



<p><strong>threadingモジュール</strong>は、Pythonでスレッドベースの並行処理を実現するためのモジュールです。スレッドは、同一プロセス内で動作する軽量な処理単位で、以下のような特徴を持っています：</p>



<h6 class="wp-block-heading"><strong>特徴：</strong></h6>



<ul class="wp-block-list">
<li><strong>軽量な並行処理</strong><br>スレッドは同じメモリ空間を共有し、効率的にタスクを実行します。</li>



<li><strong>簡単な設計</strong><br>モジュールの構造がシンプルで学びやすい。</li>



<li><strong>GILの影響を受ける</strong><br>PythonのスレッドはGIL（Global Interpreter Lock）により、同時に1つのスレッドしか実行できない。</li>
</ul>



<h2 class="wp-block-heading"><strong>threadingモジュールの基本的な使い方</strong></h2>



<h3 class="wp-block-heading"><strong>基本的なスレッドの作成</strong></h3>



<p>スレッドを作成するには、<code>threading.Thread</code>クラスを使用します。</p>



<h6 class="wp-block-heading"><strong>例：スレッドの基本的な使用方法</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import threading

def print_numbers():
    for i in range(5):
        print(f&quot;番号: {i}&quot;)

# スレッドを作成
thread = threading.Thread(target=print_numbers)

# スレッドを開始
thread.start()

# スレッドの終了を待機
thread.join()" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> threading</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">print_numbers</span><span style="color: #D4D4D4">():</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> i </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">range</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;番号: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">i</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># スレッドを作成</span></span>
<span class="line"><span style="color: #D4D4D4">thread = threading.Thread(</span><span style="color: #9CDCFE">target</span><span style="color: #D4D4D4">=print_numbers)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># スレッドを開始</span></span>
<span class="line"><span style="color: #D4D4D4">thread.start()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># スレッドの終了を待機</span></span>
<span class="line"><span style="color: #D4D4D4">thread.join()</span></span></code></pre></div>



<p><strong>説明：</strong></p>



<ul class="wp-block-list">
<li><strong><code>target</code></strong>: 実行したい関数を指定します。</li>



<li><strong><code>start()</code></strong>: スレッドを開始します。</li>



<li><strong><code>join()</code></strong>: スレッドの終了を待機します。</li>
</ul>



<h3 class="wp-block-heading"><strong>スレッドクラスの継承</strong></h3>



<p><code>Thread</code>クラスを継承して独自のスレッドを作成することも可能です。</p>



<h6 class="wp-block-heading"><strong>例：Threadクラスを継承する方法</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import threading

class MyThread(threading.Thread):
    def run(self):
        for i in range(5):
            print(f&quot;スレッド: {i}&quot;)

# スレッドインスタンスを作成
thread = MyThread()

# スレッドを開始
thread.start()

# スレッドの終了を待機
thread.join()" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> threading</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MyThread</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">threading</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Thread</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">run</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">self</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> i </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">range</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;スレッド: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">i</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># スレッドインスタンスを作成</span></span>
<span class="line"><span style="color: #D4D4D4">thread = MyThread()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># スレッドを開始</span></span>
<span class="line"><span style="color: #D4D4D4">thread.start()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># スレッドの終了を待機</span></span>
<span class="line"><span style="color: #D4D4D4">thread.join()</span></span></code></pre></div>



<h2 class="wp-block-heading"><strong>スレッドの制御</strong></h2>



<h3 class="wp-block-heading"><strong>スレッドの状態確認</strong></h3>



<p>スレッドの状態を確認するには、<code>is_alive</code>メソッドを使用します。</p>



<h6 class="wp-block-heading"><strong>例：スレッドの状態を確認</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="thread = threading.Thread(target=print_numbers)
thread.start()
print(f&quot;スレッドの状態: {thread.is_alive()}&quot;)
thread.join()
print(f&quot;スレッドの状態: {thread.is_alive()}&quot;)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">thread = threading.Thread(</span><span style="color: #9CDCFE">target</span><span style="color: #D4D4D4">=print_numbers)</span></span>
<span class="line"><span style="color: #D4D4D4">thread.start()</span></span>
<span class="line"><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;スレッドの状態: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">thread.is_alive()</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">thread.join()</span></span>
<span class="line"><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;スレッドの状態: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">thread.is_alive()</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<h3 class="wp-block-heading"><strong>デーモンスレッド</strong></h3>



<p>デーモンスレッドは、メインスレッドが終了すると強制的に終了します。</p>



<h6 class="wp-block-heading"><strong>例：デーモンスレッドの使用</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="def print_numbers():
    for i in range(10):
        print(i)

thread = threading.Thread(target=print_numbers, daemon=True)
thread.start()" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">print_numbers</span><span style="color: #D4D4D4">():</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> i </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">range</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(i)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">thread = threading.Thread(</span><span style="color: #9CDCFE">target</span><span style="color: #D4D4D4">=print_numbers, </span><span style="color: #9CDCFE">daemon</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">True</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">thread.start()</span></span></code></pre></div>



<h2 class="wp-block-heading"><strong>スレッド間の同期</strong></h2>



<h3 class="wp-block-heading"><strong>ロック（Lock）</strong></h3>



<p>スレッド間でデータ競合を防ぐためにロックを使用します。</p>



<h6 class="wp-block-heading"><strong>例：ロックの使用</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import threading

lock = threading.Lock()
counter = 0

def increment():
    global counter
    with lock:
        local_counter = counter
        local_counter += 1
        counter = local_counter

threads = [threading.Thread(target=increment) for _ in range(10)]

for thread in threads:
    thread.start()

for thread in threads:
    thread.join()

print(f&quot;カウンターの値: {counter}&quot;)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> threading</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">lock = threading.Lock()</span></span>
<span class="line"><span style="color: #D4D4D4">counter = </span><span style="color: #B5CEA8">0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">increment</span><span style="color: #D4D4D4">():</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">global</span><span style="color: #D4D4D4"> counter</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">with</span><span style="color: #D4D4D4"> lock:</span></span>
<span class="line"><span style="color: #D4D4D4">        local_counter = counter</span></span>
<span class="line"><span style="color: #D4D4D4">        local_counter += </span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">        counter = local_counter</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">threads = [threading.Thread(</span><span style="color: #9CDCFE">target</span><span style="color: #D4D4D4">=increment) </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> _ </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">range</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> thread </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> threads:</span></span>
<span class="line"><span style="color: #D4D4D4">    thread.start()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> thread </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> threads:</span></span>
<span class="line"><span style="color: #D4D4D4">    thread.join()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;カウンターの値: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">counter</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<h3 class="wp-block-heading"><strong>条件変数（Condition）</strong></h3>



<p>特定の条件でスレッドを待機させる場合に使用します。</p>



<h6 class="wp-block-heading"><strong>例：条件変数の使用</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import threading

condition = threading.Condition()

def worker():
    with condition:
        print(&quot;スレッドが待機中...&quot;)
        condition.wait()
        print(&quot;スレッドが再開しました！&quot;)

def notifier():
    with condition:
        print(&quot;通知を送信します...&quot;)
        condition.notify_all()

worker_thread = threading.Thread(target=worker)
notifier_thread = threading.Thread(target=notifier)

worker_thread.start()
notifier_thread.start()

worker_thread.join()
notifier_thread.join()" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> threading</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">condition = threading.Condition()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">worker</span><span style="color: #D4D4D4">():</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">with</span><span style="color: #D4D4D4"> condition:</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;スレッドが待機中...&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        condition.wait()</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;スレッドが再開しました！&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">notifier</span><span style="color: #D4D4D4">():</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">with</span><span style="color: #D4D4D4"> condition:</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;通知を送信します...&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        condition.notify_all()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">worker_thread = threading.Thread(</span><span style="color: #9CDCFE">target</span><span style="color: #D4D4D4">=worker)</span></span>
<span class="line"><span style="color: #D4D4D4">notifier_thread = threading.Thread(</span><span style="color: #9CDCFE">target</span><span style="color: #D4D4D4">=notifier)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">worker_thread.start()</span></span>
<span class="line"><span style="color: #D4D4D4">notifier_thread.start()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">worker_thread.join()</span></span>
<span class="line"><span style="color: #D4D4D4">notifier_thread.join()</span></span></code></pre></div>



<h2 class="wp-block-heading"><strong>threadingを使った応用例</strong></h2>



<h3 class="wp-block-heading"><strong>タスクの並行実行</strong></h3>



<p>複数のタスクを並行して実行します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import threading

def task(name, delay):
    for i in range(3):
        print(f&quot;{name}: 実行中 {i}&quot;)
        time.sleep(delay)

threads = [
    threading.Thread(target=task, args=(&quot;タスク1&quot;, 1)),
    threading.Thread(target=task, args=(&quot;タスク2&quot;, 2)),
]

for thread in threads:
    thread.start()

for thread in threads:
    thread.join()" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> threading</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">task</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">delay</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> i </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">range</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">name</span><span style="color: #569CD6">}</span><span style="color: #CE9178">: 実行中 </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">i</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        time.sleep(delay)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">threads = [</span></span>
<span class="line"><span style="color: #D4D4D4">    threading.Thread(</span><span style="color: #9CDCFE">target</span><span style="color: #D4D4D4">=task, </span><span style="color: #9CDCFE">args</span><span style="color: #D4D4D4">=(</span><span style="color: #CE9178">&quot;タスク1&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)),</span></span>
<span class="line"><span style="color: #D4D4D4">    threading.Thread(</span><span style="color: #9CDCFE">target</span><span style="color: #D4D4D4">=task, </span><span style="color: #9CDCFE">args</span><span style="color: #D4D4D4">=(</span><span style="color: #CE9178">&quot;タスク2&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">)),</span></span>
<span class="line"><span style="color: #D4D4D4">]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> thread </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> threads:</span></span>
<span class="line"><span style="color: #D4D4D4">    thread.start()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> thread </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> threads:</span></span>
<span class="line"><span style="color: #D4D4D4">    thread.join()</span></span></code></pre></div>



<h3 class="wp-block-heading"><strong>プログレスバーの更新</strong></h3>



<p>スレッドを使ってプログレスバーを更新する処理を実装します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import threading
import time

def update_progress():
    for i in range(10):
        print(f&quot;進行状況: {i+1}/10&quot;)
        time.sleep(1)

thread = threading.Thread(target=update_progress)
thread.start()
thread.join()" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> threading</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> time</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">update_progress</span><span style="color: #D4D4D4">():</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> i </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">range</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;進行状況: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">i+</span><span style="color: #B5CEA8">1</span><span style="color: #569CD6">}</span><span style="color: #CE9178">/10&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        time.sleep(</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">thread = threading.Thread(</span><span style="color: #9CDCFE">target</span><span style="color: #D4D4D4">=update_progress)</span></span>
<span class="line"><span style="color: #D4D4D4">thread.start()</span></span>
<span class="line"><span style="color: #D4D4D4">thread.join()</span></span></code></pre></div>



<h2 class="wp-block-heading"><strong>threadingの注意点</strong></h2>



<ol class="wp-block-list">
<li><strong>GILの影響</strong><br>PythonのスレッドはGILの制約を受けるため、CPUバウンドタスクには適していません。</li>



<li><strong>データ競合</strong><br>複数のスレッドが同じデータにアクセスする場合は、ロックや同期を適切に使用する必要があります。</li>



<li><strong>デバッグの難しさ</strong><br>並行処理におけるエラーは再現が難しいため、デバッグに時間がかかる場合があります。</li>
</ol>



<h2 class="wp-block-heading"><strong>まとめ</strong></h2>



<p>Pythonのthreadingモジュールは、軽量なスレッド処理を実現するための便利なツールです。この記事で解説した基本的な使い方や同期方法を参考に、スレッドを活用して効率的なプログラムを作成してください！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/python-threading/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: techgrowup.net @ 2026-05-05 03:31:30 by W3 Total Cache
-->