<?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>concurrent.futures  |  Python-memo｜自動化・AI・Web開発の実験室</title>
	<atom:link href="https://python.cbagames.jp/tag/concurrent-futures/feed/" rel="self" type="application/rss+xml" />
	<link>https://python.cbagames.jp</link>
	<description>Pythonで、できるをふやそう。</description>
	<lastBuildDate>Wed, 04 Feb 2026 05:14:57 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://python.cbagames.jp/wp-content/uploads/2025/06/cropped-497d491d54402de785c9e043bfa0620a-32x32.png</url>
	<title>concurrent.futures  |  Python-memo｜自動化・AI・Web開発の実験室</title>
	<link>https://python.cbagames.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Pythonの並列処理を完全理解！concurrent.futuresで簡単マルチスレッド＆マルチプロセス</title>
		<link>https://python.cbagames.jp/2025/06/21/python-concurrent-futures-multithread-multiprocess/</link>
					<comments>https://python.cbagames.jp/2025/06/21/python-concurrent-futures-multithread-multiprocess/#respond</comments>
		
		<dc:creator><![CDATA[asukapy]]></dc:creator>
		<pubDate>Sat, 21 Jun 2025 03:21:43 +0000</pubDate>
				<category><![CDATA[自動化スクリプト]]></category>
		<category><![CDATA[concurrent.futures]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[マルチスレッド]]></category>
		<category><![CDATA[マルチプロセス]]></category>
		<category><![CDATA[並列処理]]></category>
		<category><![CDATA[非同期処理]]></category>
		<category><![CDATA[高速化]]></category>
		<guid isPermaLink="false">https://python.cbagames.jp/?p=471</guid>

					<description><![CDATA[目次 1. はじめに｜Pythonの処理を高速化したい人へ2. 逐次処理とは？｜まずは基本からおさらい■ 逐次処理ってなに？■ どんなイメージ？■ どんなときに困る？3. 並列処理と並行処理の違いをわかりやすく解説■ 並 [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2"><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">1. はじめに｜Pythonの処理を高速化したい人へ</a></li><li><a href="#toc2" tabindex="0">2. 逐次処理とは？｜まずは基本からおさらい</a><ol><li><a href="#toc3" tabindex="0">■ 逐次処理ってなに？</a></li><li><a href="#toc4" tabindex="0">■ どんなイメージ？</a></li><li><a href="#toc5" tabindex="0">■ どんなときに困る？</a></li></ol></li><li><a href="#toc6" tabindex="0">3. 並列処理と並行処理の違いをわかりやすく解説</a><ol><li><a href="#toc7" tabindex="0">■ 並列処理（へいれつしょり）とは？</a></li><li><a href="#toc8" tabindex="0">■ 並行処理（へいこうしょり）とは？</a></li><li><a href="#toc9" tabindex="0">■ 並列 vs 並行：まとめると？</a></li></ol></li><li><a href="#toc10" tabindex="0">4. マルチスレッドとマルチプロセスの違いと使い分け</a><ol><li><a href="#toc11" tabindex="0">■ そもそも「プロセス」と「スレッド」ってなに？</a></li><li><a href="#toc12" tabindex="0">■ マルチスレッドの特徴と使いどころ</a><ol><li><a href="#toc13" tabindex="0">✅ メリット</a></li><li><a href="#toc14" tabindex="0">⚠ デメリット</a></li><li><a href="#toc15" tabindex="0">💡 向いている処理（I/Oバウンド）</a></li></ol></li><li><a href="#toc16" tabindex="0">■ マルチプロセスの特徴と使いどころ</a><ol><li><a href="#toc17" tabindex="0">✅ メリット</a></li><li><a href="#toc18" tabindex="0">⚠ デメリット</a></li><li><a href="#toc19" tabindex="0">💡 向いている処理（CPUバウンド）</a></li></ol></li><li><a href="#toc20" tabindex="0">■ どっちを使えばいいの？</a></li></ol></li><li><a href="#toc21" tabindex="0">5. concurrent.futuresとは？｜初心者にやさしい並列処理モジュール</a><ol><li><a href="#toc22" tabindex="0">■ concurrent.futuresってなに？</a></li><li><a href="#toc23" tabindex="0">■ 2つのExecutorクラスがポイント！</a></li><li><a href="#toc24" tabindex="0">■ どんな書き方をするの？</a></li><li><a href="#toc25" tabindex="0">■ なにがそんなに便利なの？</a></li></ol></li><li><a href="#toc26" tabindex="0">6. ThreadPoolExecutorの使い方</a><ol><li><a href="#toc27" tabindex="0">■ 処理の流れをざっくり説明すると…</a></li><li><a href="#toc28" tabindex="0">■ まずは基本のコードから</a></li><li><a href="#toc29" tabindex="0">■ 実行結果のイメージ</a></li><li><a href="#toc30" tabindex="0">■ map()を使うともっとスッキリ！</a></li><li><a href="#toc31" tabindex="0">■ こんなときに便利！</a></li></ol></li><li><a href="#toc32" tabindex="0">7. ProcessPoolExecutorの使い方</a><ol><li><a href="#toc33" tabindex="0">■ 基本の使い方（コード例）</a></li><li><a href="#toc34" tabindex="0">■ 実行結果のイメージ</a></li><li><a href="#toc35" tabindex="0">■ 注意点：if name == &#8220;main&#8221; の意味</a></li><li><a href="#toc36" tabindex="0">■ map()も使えます！</a></li><li><a href="#toc37" tabindex="0">■ どんなときに使うの？</a></li></ol></li><li><a href="#toc38" tabindex="0">8. 注意点とベストプラクティス</a><ol><li><a href="#toc39" tabindex="0">✅ 1. GILの影響に注意しよう（マルチスレッド）</a></li><li><a href="#toc40" tabindex="0">✅ 2. if __name__ == "__main__" を忘れずに（マルチプロセス）</a></li><li><a href="#toc41" tabindex="0">✅ 3. max_workersの数はほどほどに</a></li><li><a href="#toc42" tabindex="0">✅ 4. 戻り値を忘れずに扱おう（Future）</a></li><li><a href="#toc43" tabindex="0">✅ 5. デバッグしづらいので print で確認しよう</a></li></ol></li><li><a href="#toc44" tabindex="0">9. まとめ</a><ol><li><a href="#toc45" tabindex="0">🔁 おさらいポイント</a></li><li><a href="#toc46" tabindex="0">🛠 実務でも使えるシーン</a></li><li><a href="#toc47" tabindex="0">🤝 初心者にもやさしい！</a></li><li><a href="#toc48" tabindex="0">✅ あわせて読みたい</a></li></ol></li><li><a href="#toc49" tabindex="0">よくある質問（Q&amp;A）</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">1. はじめに｜Pythonの処理を高速化したい人へ</span></h2>



<p>Pythonでプログラムを書いていると、</p>



<p>「処理が遅い…」<br>「for文で順番に回しているのが限界に感じる」<br>「待ち時間が多くて、もっと効率よくできないの？」</p>



<p>と感じる場面はありませんか？</p>



<p>たとえば、</p>



<ul class="wp-block-list">
<li>大量データを処理するバッチ処理</li>



<li>Webスクレイピングで複数ページを取得するとき</li>



<li>APIのレスポンス待ちが続く処理</li>
</ul>



<p>こうしたケースでは、**処理を「同時に進められるかどうか」**が、実行時間を大きく左右します。</p>



<p>そこで役立つのが、**Pythonの「並列処理・並行処理」**です。<br>処理を1つずつ順番に実行するのではなく、複数のタスクを同時に扱うことで、体感できるレベルで高速化できることも珍しくありません。</p>



<p>とはいえ、</p>



<ul class="wp-block-list">
<li>並列処理と並行処理の違いがよく分からない</li>



<li>マルチスレッドとマルチプロセスって何が違うの？</li>



<li>難しそうで手を出しづらい…</li>
</ul>



<p>と感じている方も多いはずです。</p>



<p>安心してください。<br>Pythonには <strong><code>concurrent.futures</code></strong> という標準ライブラリがあり、複雑な仕組みを意識しなくても、<strong>初心者でも安全にマルチスレッド・マルチプロセスを扱える</strong>ようになっています。</p>



<p>この記事では、</p>



<ul class="wp-block-list">
<li>「並列処理」と「並行処理」の違い</li>



<li>マルチスレッドとマルチプロセスの使い分け</li>



<li><code>concurrent.futures</code> を使った具体的な書き方</li>
</ul>



<p>を、<strong>for文に慣れてきた人が次のステップに進めるレベル感</strong>で、やさしく解説していきます。</p>



<p>「Pythonをもっと速く動かしたい」<br>「処理時間のストレスから解放されたい」</p>



<p>そんな方は、ぜひ最後まで読み進めてみてください。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc2">2. 逐次処理とは？｜まずは基本からおさらい</span></h2>



<p>まずは、<strong>Pythonの標準的な処理の流れ</strong>である「<strong>逐次処理（ちくじしょり）</strong>」について確認しておきましょう。</p>



<h3 class="wp-block-heading"><span id="toc3">■ 逐次処理ってなに？</span></h3>



<p>逐次処理とは、<strong>コードが上から順番にひとつずつ実行される流れ</strong>のことです。Pythonで普通にプログラムを書くと、たいていはこの逐次処理になります。</p>



<p>たとえば、こんなコードを見てみましょう。</p>



<pre class="wp-block-preformatted"><code>print("1つ目の処理")<br>print("2つ目の処理")<br>print("3つ目の処理")<br></code></pre>



<p>この場合、実行すると</p>



<pre class="wp-block-preformatted"><code>1つ目の処理<br>2つ目の処理<br>3つ目の処理<br></code></pre>



<p>というように、上から順に一つずつ表示されます。これが「逐次処理」です。</p>



<h3 class="wp-block-heading"><span id="toc4">■ どんなイメージ？</span></h3>



<p>イメージとしては、<strong>1人の作業者が1つの仕事を終えてから次の仕事に取りかかる</strong>ようなものです。たとえば、</p>



<ul class="wp-block-list">
<li>料理を作る → 食器を洗う → 掃除をする</li>
</ul>



<p>というように、一つずつ順番に片づけていく流れです。</p>



<h3 class="wp-block-heading"><span id="toc5">■ どんなときに困る？</span></h3>



<p>逐次処理はシンプルで分かりやすいのですが、<strong>時間がかかる作業が途中にあると、そのあとの処理が全部待たされてしまう</strong>という欠点があります。</p>



<p>たとえば、</p>



<ul class="wp-block-list">
<li>Webサイトにアクセスしてデータを取得（5秒）</li>



<li>データを表示（1秒）</li>
</ul>



<p>という2つの作業があると、最初の「5秒」が終わらないと次に進めません。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>こういった場合、<strong>待ち時間を有効活用できたら便利</strong>ですよね。そこで登場するのが「並列処理」や「並行処理」です！</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc6">3. 並列処理と並行処理の違いをわかりやすく解説</span></h2>



<p>ここからは、Pythonで処理を効率よく進めるためのキーワードである「<strong>並列処理</strong>」と「<strong>並行処理</strong>」の違いについて説明します。</p>



<p>この2つ、言葉は似ているけど<strong>意味と使い方がちょっと違う</strong>ので、イメージでしっかり理解しておきましょう！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc7">■ 並列処理（へいれつしょり）とは？</span></h3>



<p><strong>並列処理</strong>は、<strong>複数の作業を同時に実行すること</strong>を指します。</p>



<p>たとえば、以下のような状況を想像してみてください。</p>



<p>🍳 Aさんが料理、Bさんが掃除、Cさんが洗濯を「同時に」やっている。</p>



<p>つまり、<strong>3人がそれぞれ別の作業を同時にしている</strong>イメージです。これが並列処理です。</p>



<p>Pythonでは「<strong>マルチプロセス</strong>」という仕組みを使って、この並列処理を実現します。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc8">■ 並行処理（へいこうしょり）とは？</span></h3>



<p>一方、<strong>並行処理</strong>は、<strong>1人の作業者が、うまくタイミングを調整して複数の作業を少しずつこなすこと</strong>を指します。</p>



<p>例えば…</p>



<p>🧍‍♂️Aさんが、鍋を煮込んでいる間に床を掃除し、さらに洗濯機が止まるのを待ちながらアイロンがけをしている。</p>



<p>つまり、<strong>ひとつの作業の「待ち時間」を使って、別の作業を進めている</strong>感じです。</p>



<p>Pythonでは、「<strong>マルチスレッド</strong>」という仕組みを使って、この並行処理を行います。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc9">■ 並列 vs 並行：まとめると？</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>分類</th><th>イメージ</th><th>Pythonで使う技術</th><th>向いている処理</th></tr></thead><tbody><tr><td>並列処理</td><td>複数人が同時に作業</td><td>マルチプロセス</td><td>計算量の多い処理（CPUバウンド）</td></tr><tr><td>並行処理</td><td>1人が作業の合間に別の仕事をする</td><td>マルチスレッド</td><td>待ち時間のある処理（I/Oバウンド）</td></tr></tbody></table></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>次は、Pythonの「マルチスレッド」と「マルチプロセス」が<strong>それぞれどうやって動くのか、どんな特徴があるのか</strong>を、もう少し深掘りしていきます！</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc10">4. マルチスレッドとマルチプロセスの違いと使い分け</span></h2>



<p>前の章で「並列処理＝マルチプロセス」「並行処理＝マルチスレッド」と紹介しましたね。<br>では実際に、**マルチスレッドとマルチプロセスはどこが違って、どう使い分ければいいのか？**をもう少し具体的に見ていきましょう。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc11">■ そもそも「プロセス」と「スレッド」ってなに？</span></h3>



<p>まずは言葉の定義をシンプルに説明します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>用語</th><th>説明</th></tr></thead><tbody><tr><td><strong>プロセス</strong></td><td>コンピューター上で動いているアプリやプログラムの単位のこと。Pythonでスクリプトを実行すると1つのプロセスになります。</td></tr><tr><td><strong>スレッド</strong></td><td>プロセスの中で動く、さらに小さな実行単位。1つのプロセスの中で複数のスレッドを同時に動かすことができます。</td></tr></tbody></table></figure>



<p>ざっくり言えば、<strong>プロセスはアプリ本体、スレッドはその中で同時に動く作業員</strong>といったイメージです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc12">■ マルチスレッドの特徴と使いどころ</span></h3>



<p><strong>マルチスレッド</strong>は、1つのプロセス内で<strong>複数のスレッドを動かす処理方法</strong>です。</p>



<h4 class="wp-block-heading"><span id="toc13">✅ メリット</span></h4>



<ul class="wp-block-list">
<li><strong>メモリ消費が少ない</strong>（プロセスを増やさないから）</li>



<li><strong>データ共有が簡単</strong>（同じメモリ空間で動くため）</li>
</ul>



<h4 class="wp-block-heading"><span id="toc14">⚠ デメリット</span></h4>



<ul class="wp-block-list">
<li>Pythonでは「<strong>GIL（グローバルインタプリタロック）</strong>」という仕組みがあるため、<strong>CPUをたくさん使う処理にはあまり向いていません</strong></li>
</ul>



<h4 class="wp-block-heading"><span id="toc15">💡 向いている処理（I/Oバウンド）</span></h4>



<ul class="wp-block-list">
<li>ネットワーク通信（APIアクセス、Webクローリングなど）</li>



<li>ファイル読み書き</li>



<li>データベースとのやりとり　など</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc16">■ マルチプロセスの特徴と使いどころ</span></h3>



<p><strong>マルチプロセス</strong>は、<strong>複数のPythonプロセスを立ち上げて同時に処理を進める方法</strong>です。</p>



<h4 class="wp-block-heading"><span id="toc17">✅ メリット</span></h4>



<ul class="wp-block-list">
<li>各プロセスが独立しているので、<strong>GILの制限を受けずにCPUをフル活用できる</strong></li>



<li><strong>重たい計算処理に強い</strong></li>
</ul>



<h4 class="wp-block-heading"><span id="toc18">⚠ デメリット</span></h4>



<ul class="wp-block-list">
<li><strong>メモリを多く消費</strong>する</li>



<li>プロセス間での<strong>データ共有がやや面倒</strong></li>
</ul>



<h4 class="wp-block-heading"><span id="toc19">💡 向いている処理（CPUバウンド）</span></h4>



<ul class="wp-block-list">
<li>数値計算（例：画像処理、機械学習の前処理など）</li>



<li>シミュレーション処理</li>



<li>複雑なアルゴリズムの計算　など</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc20">■ どっちを使えばいいの？</span></h3>



<p>簡単な目安としては以下のように考えましょう。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>処理のタイプ</th><th>おすすめ</th></tr></thead><tbody><tr><td><strong>待ち時間が多い処理（I/Oバウンド）</strong></td><td>マルチスレッド（<code>ThreadPoolExecutor</code>）</td></tr><tr><td><strong>CPUをたくさん使う処理（CPUバウンド）</strong></td><td>マルチプロセス（<code>ProcessPoolExecutor</code>）</td></tr></tbody></table></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>次は、実際にPythonコードで「<code>concurrent.futures</code>」を使ってマルチスレッドを実装してみましょう！</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc21">5. concurrent.futuresとは？｜初心者にやさしい並列処理モジュール</span></h2>



<p>ここまで読んで、「マルチスレッドとマルチプロセスって便利そう！」と思った方も多いのではないでしょうか？<br>でも実際にコードで使おうとすると、<code>threading</code>や<code>multiprocessing</code>モジュールは、ちょっとややこしい構文が多くて混乱しやすいんですよね。</p>



<p>そんなときに使いたいのが、**<code>concurrent.futures</code>**モジュールです！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc22">■ concurrent.futuresってなに？</span></h3>



<p><code>concurrent.futures</code>は、<strong>Python 3.2から使える標準モジュール</strong>で、<br>「<strong>マルチスレッド</strong>」と「<strong>マルチプロセス</strong>」の両方を<strong>ほぼ同じ書き方で扱える</strong>という、超便利な仕組みです。</p>



<p>むずかしい用語を覚えなくても、たった数行で並列・並行処理ができちゃいます！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc23">■ 2つのExecutorクラスがポイント！</span></h3>



<p>このモジュールの主役は、次の2つのクラスです：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>クラス名</th><th>内容</th></tr></thead><tbody><tr><td><code>ThreadPoolExecutor</code></td><td>スレッドを使った並行処理</td></tr><tr><td><code>ProcessPoolExecutor</code></td><td>プロセスを使った並列処理</td></tr></tbody></table></figure>



<p>どちらも「Executor（実行者）」という名前の通り、処理を並べて実行してくれる<strong>便利屋さん</strong>のような存在です。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc24">■ どんな書き方をするの？</span></h3>



<p>基本の構文はとってもシンプルです：</p>



<pre class="wp-block-preformatted"><code>from concurrent.futures import ThreadPoolExecutor<br><br>def my_task(n):<br>    # 何らかの処理<br>    return n * 2<br><br>with ThreadPoolExecutor(max_workers=2) as executor:<br>    future = executor.submit(my_task, 10)<br>    result = future.result()<br>    print(result)  # → 20<br></code></pre>



<p>このように、</p>



<ul class="wp-block-list">
<li><code>submit()</code>で関数を非同期に実行</li>



<li><code>result()</code>で結果を受け取る</li>
</ul>



<p>という流れが基本です。<br>さらに、複数のデータを一気に処理したいときは<code>map()</code>関数が使えます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc25">■ なにがそんなに便利なの？</span></h3>



<ol class="wp-block-list">
<li><strong>同じ書き方でスレッドもプロセスも切り替えられる</strong></li>



<li><code>with</code>構文でリソース管理がラク</li>



<li>直感的に書けて初心者にもわかりやすい</li>
</ol>



<p>「まずは処理を速くしたい！」という人にとって、<strong>ベストな入門ツール</strong>です！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc26">6. ThreadPoolExecutorの使い方</span></h2>



<p>ここからは、実際にPythonで<strong>スレッドによる並行処理</strong>を実装してみましょう。使うのはもちろん、<code>concurrent.futures</code>の中の**<code>ThreadPoolExecutor</code>**です。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc27">■ 処理の流れをざっくり説明すると…</span></h3>



<ol class="wp-block-list">
<li>実行したい関数を用意する</li>



<li><code>ThreadPoolExecutor</code>で「作業者」を用意する</li>



<li><code>submit()</code>や<code>map()</code>で関数を並行実行する</li>



<li><code>result()</code>で結果を受け取る</li>
</ol>



<p>この4ステップだけでOK！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc28">■ まずは基本のコードから</span></h3>



<pre class="wp-block-preformatted"><code>from concurrent.futures import ThreadPoolExecutor<br>import time<br><br># 処理する関数<br>def slow_task(n):<br>    print(f"処理中: {n}")<br>    time.sleep(2)<br>    return n * 10<br><br># スレッドで並行実行<br>with ThreadPoolExecutor(max_workers=2) as executor:<br>    future1 = executor.submit(slow_task, 1)<br>    future2 = executor.submit(slow_task, 2)<br><br>    # 処理の完了を待って結果を取得<br>    result1 = future1.result()<br>    result2 = future2.result()<br><br>    print("結果1:", result1)<br>    print("結果2:", result2)<br></code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc29">■ 実行結果のイメージ</span></h3>



<pre class="wp-block-preformatted"><code>処理中: 1<br>処理中: 2<br>（2秒後）<br>結果1: 10<br>結果2: 20<br></code></pre>



<p>ここでは「max_workers=2」としているので、<strong>2つの処理が同時に動いている</strong>のがわかります。</p>



<p>もし<code>max_workers=1</code>だったら、1つずつ順番に動く「逐次処理」になってしまいます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc30">■ map()を使うともっとスッキリ！</span></h3>



<p>同じ関数を複数の引数で処理したいなら、<code>map()</code>を使うととてもスマートです。</p>



<pre class="wp-block-preformatted"><code>with ThreadPoolExecutor(max_workers=3) as executor:<br>    results = executor.map(slow_task, [1, 2, 3])<br>    for r in results:<br>        print("結果:", r)<br></code></pre>



<p>これだけで、<strong>3つのタスクを並行で実行し、順に結果を受け取れます。</strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc31">■ こんなときに便利！</span></h3>



<ul class="wp-block-list">
<li>複数のWeb APIにアクセスするとき</li>



<li>複数のファイルを読み書きするとき</li>



<li>複数の画像やPDFを処理するとき</li>
</ul>



<p>I/Oが多い場面では、スレッドで**「待っている間に別の作業」**をするだけで、処理時間が大きく短縮できます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc32">7. ProcessPoolExecutorの使い方</span></h2>



<p>前の章では、スレッドを使って「待ち時間のある処理（I/Oバウンド）」を並行して実行する方法を紹介しました。<br>今度は、<strong>複数のプロセスを使って計算を速くする</strong>「<strong>ProcessPoolExecutor</strong>」の使い方を見ていきましょう！</p>



<p>実は…<strong>書き方はほぼ同じ！</strong><br><code>ThreadPoolExecutor</code>を<code>ProcessPoolExecutor</code>に変えるだけでOKなんです！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc33">■ 基本の使い方（コード例）</span></h3>



<pre class="wp-block-preformatted"><code>from concurrent.futures import ProcessPoolExecutor<br>import time<br><br># CPUを使う処理（たとえば重たい計算）<br>def heavy_task(n):<br>    print(f"処理中: {n}")<br>    time.sleep(2)<br>    return n * n<br><br># プロセスで並列実行<br>if __name__ == "__main__":<br>    with ProcessPoolExecutor(max_workers=2) as executor:<br>        future1 = executor.submit(heavy_task, 3)<br>        future2 = executor.submit(heavy_task, 5)<br><br>        result1 = future1.result()<br>        result2 = future2.result()<br><br>        print("結果1:", result1)<br>        print("結果2:", result2)<br></code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc34">■ 実行結果のイメージ</span></h3>



<pre class="wp-block-preformatted"><code>処理中: 3<br>処理中: 5<br>（2秒後）<br>結果1: 9<br>結果2: 25<br></code></pre>



<p>この例でも、「max_workers=2」としているので、<strong>2つのプロセスが並列に動いて</strong>処理時間が短くなっています。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc35">■ 注意点：if name == &#8220;main&#8221; の意味</span></h3>



<p>WindowsやMacでこのコードを動かすときは、必ず次のように書いてください👇</p>



<pre class="wp-block-preformatted"><code>if __name__ == "__main__":<br>    # ここに処理を書く<br></code></pre>



<p>これは、「このファイルが直接実行されたときだけ中身を動かす」というPythonの決まりです。<br>マルチプロセスでこれを書かないと、<strong>無限にプロセスが増えるバグが起きることもある</strong>ので要注意です！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc36">■ map()も使えます！</span></h3>



<p>複数の引数に対してまとめて処理したい場合は、<code>map()</code>も使えます。</p>



<pre class="wp-block-preformatted"><code>if __name__ == "__main__":<br>    with ProcessPoolExecutor(max_workers=3) as executor:<br>        results = executor.map(heavy_task, [1, 2, 3])<br>        for r in results:<br>            print("結果:", r)<br></code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc37">■ どんなときに使うの？</span></h3>



<ul class="wp-block-list">
<li>画像や動画などの重いファイルを一括処理したいとき</li>



<li>数値計算が多い処理を高速化したいとき</li>



<li>AIモデルや統計計算の前処理　など</li>
</ul>



<p>とにかく「<strong>CPUをよく使う処理</strong>」に強いのが、マルチプロセスの魅力です。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc38">8. 注意点とベストプラクティス</span></h2>



<p>ここまでで、Pythonで<strong>マルチスレッド</strong>（ThreadPoolExecutor）と<strong>マルチプロセス</strong>（ProcessPoolExecutor）を使って、処理を効率よく並列・並行に実行する方法を学びました。</p>



<p>でも、実際のプログラムに取り入れる前に、<strong>知っておくとトラブルを防げるポイント</strong>があります。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc39">✅ 1. GILの影響に注意しよう（マルチスレッド）</span></h3>



<p>Pythonには「**GIL（グローバルインタプリタロック）」**という仕組みがあります。</p>



<p>これは、<strong>1つのPythonプロセスで同時に複数のスレッドが実行されないように制限をかける仕組み</strong>です。</p>



<ul class="wp-block-list">
<li>**I/Oが多い処理（API、ファイル読み書き）**には問題ありません。</li>



<li>でも、<strong>CPUをたくさん使う重たい処理</strong>だと、スレッドを増やしてもあまり速くなりません。</li>
</ul>



<p>そういうときは、**ProcessPoolExecutor（マルチプロセス）**のほうが効果的です。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc40">✅ 2. if __name__ == "__main__" を忘れずに（マルチプロセス）</span></h3>



<p>マルチプロセスでコードを書くときは、<strong>必ず</strong>このブロックで実行部分を囲みましょう。</p>



<pre class="wp-block-preformatted"><code>if __name__ == "__main__":<br>    # 並列処理のコードはここに書く<br></code></pre>



<p>これは特に<strong>WindowsやMacで重要</strong>です。これを忘れると、プログラムが予期せず再帰的に自分を呼び出して、<strong>無限ループやクラッシュの原因になります</strong>。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc41">✅ 3. max_workersの数はほどほどに</span></h3>



<p><code>max_workers</code>でワーカー数（同時に動かす処理の数）を指定できますが、<strong>多すぎると逆に遅くなる</strong>ことがあります。</p>



<ul class="wp-block-list">
<li>目安は、マルチプロセスなら「CPUのコア数」、マルチスレッドなら「処理の待ち時間に応じて」</li>



<li>コア数は、次のコードで確認できます：</li>
</ul>



<pre class="wp-block-preformatted"><code>import os<br>print(os.cpu_count())  # 例: 8<br></code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc42">✅ 4. 戻り値を忘れずに扱おう（Future）</span></h3>



<p><code>submit()</code>で実行した処理は、<strong><code>Future</code>オブジェクト</strong>として返ってきます。これをちゃんと<code>result()</code>で受け取らないと、<strong>処理が終わったかどうかわからない</strong>まま次に進んでしまうことがあります。</p>



<pre class="wp-block-preformatted"><code>future = executor.submit(task, 10)<br>result = future.result()  # 処理の完了を待って結果を取得<br></code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc43">✅ 5. デバッグしづらいので print で確認しよう</span></h3>



<p>並列・並行処理では、処理の順番がバラバラになることがあります。<br>そのため、どの処理が今どこで動いているのか、<strong>print文でログを出しておくと安心</strong>です。</p>



<pre class="wp-block-preformatted"><code>print(f"タスク{n}を開始します")<br></code></pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>以上のポイントを押さえておけば、<code>concurrent.futures</code>を使った並列・並行処理を<strong>安全かつ効果的に</strong>実装できます！</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc44">9. まとめ</span></h2>



<p>今回は、Pythonの処理を効率化・高速化する方法として「<strong>並列処理と並行処理</strong>」、そしてそれをシンプルに実装できる「<strong>concurrent.futures</strong>モジュール」について解説してきました。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc45">🔁 おさらいポイント</span></h3>



<ul class="wp-block-list">
<li><strong>逐次処理</strong>は、処理を1つずつ順番に実行するやり方。簡単だけど待ち時間がネックになる。</li>



<li>**並列処理（マルチプロセス）**は、複数のプロセスを同時に動かして、**計算が重い処理（CPUバウンド）**を速くする方法。</li>



<li>**並行処理（マルチスレッド）**は、待ち時間の合間に他の作業を進めて、**I/O待ちの処理（APIやファイル操作）**を効率よくこなす方法。</li>



<li><code>concurrent.futures</code>を使えば、どちらの方式も<strong>同じような書き方で簡単に実装できる</strong>！</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc46">🛠 実務でも使えるシーン</span></h3>



<ul class="wp-block-list">
<li>Webスクレイピングで複数ページを同時取得</li>



<li>複数のファイルを並行して読み込み・変換</li>



<li>複雑な数値処理をマルチプロセスで高速化</li>



<li>バックグラウンド処理を簡単に導入　など</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc47">🤝 初心者にもやさしい！</span></h3>



<p>難しそうに思える「並列・並行処理」も、<code>concurrent.futures</code>を使えば<strong>たった数行のコードで実現</strong>できます。</p>



<p>最初は小さな処理からでもいいので、ぜひ実際に試してみてください。<br>「時間がかかっていたあの処理、こんなに速くなるのか！」ときっと驚くはずです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc48">✅ あわせて読みたい</span></h3>



<p>以下の記事もあわせて読むことで、Pythonの処理効率や実用スキルをさらに高めることができます！</p>



<ul class="wp-block-list">
<li>🔗 <a target="_blank" href="https://python.cbagames.jp/2025/06/14/python-debugger-breakpoint/">Pythonのデバッガー（breakpoint関数）の使い方｜初心者でも試せるデバッグ入門</a><br>　→ 並列処理でうまく動かないときの原因追跡に便利！</li>



<li>🔗 <a target="_blank" href="https://python.cbagames.jp/2025/06/16/python-higher-order-functions/">Pythonの高階関数（map・filter・reduce）の使い方と実例</a><br>　→ <code>concurrent.futures.map()</code>と関連して、map関数の基本理解に役立ちます。</li>



<li>🔗 <a target="_blank" href="https://python.cbagames.jp/2025/06/15/python-matplotlib-graph-beginner/">Pythonでグラフ描画｜Matplotlibの使い方解説</a><br>　→ 処理結果の可視化や、並列で処理したデータの表示に活用できます。</li>



<li>🔗 <a target="_blank" href="https://python.cbagames.jp/2025/06/04/web-scraping-requests-beautifulsoup/">PythonでWebスクレイピングを自動化！Beautiful SoupとRequestsの基本</a><br>　→ 並行処理を使うことで、Webスクレイピングの高速化が可能になります。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc49">よくある質問（Q&amp;A）</span></h2>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">並列処理と並行処理の違いって何ですか？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>並列処理は「複数の作業をまったく同時に実行する」ことで、主に<strong>マルチプロセス</strong>で実現されます。並行処理は「1人が交互に複数の作業をこなす」イメージで、<strong>マルチスレッド</strong>で実現されます。処理の性質によって使い分けましょう。</p>
</div></dd></dl></div>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">ThreadPoolExecutorとProcessPoolExecutor、どっちを使えばいいの？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>**待ち時間の多い処理（I/Oバウンド）**には<code>ThreadPoolExecutor</code></p>



<p>**計算量の多い処理（CPUバウンド）**には<code>ProcessPoolExecutor</code><br>が向いています。</p>
</div></dd></dl></div>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content"><code>submit()</code>と<code>map()</code>はどう違うんですか？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p><code>submit()</code>は<strong>1つずつ処理を追加できる</strong>方法で、<code>Future</code>を使って戻り値を受け取れます。</p>



<p><code>map()</code>は<strong>リストや複数の値を一括で処理する</strong>のに向いていて、簡潔に書けます。</p>
</div></dd></dl></div>
]]></content:encoded>
					
					<wfw:commentRss>https://python.cbagames.jp/2025/06/21/python-concurrent-futures-multithread-multiprocess/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
