検索


はい、ここでの公開を停止していましたが、マーケティングの観点からは公開を継続する方が良いと考えられます...継続します。

ここに最初に公開されたテキスト。


このテキストの目的は、Python 言語の同時実行性と並列処理を理解するために必要な基本概念を直接要約することです。このテーマについて最低限の知識を持っておくか、このテキストと他の情報源からの学習を組み合わせることをお勧めします。すべての参考文献は本文の最後にあります。

次のトピックについて説明します:

  • プロセスとは何ですか?
  • スレッドとは何ですか?
  • I/O バウンドと CPU バウンドとは何を意味しますか?
  • Python GIL とは何ですか?
  • 競争とは何ですか?
  • 並列処理とは何ですか?
  • asyncio ライブラリ
  • スレッド ライブラリ
  • マルチプロセッシング ライブラリ

プロセスとは何ですか?

コンピューティングにおいて、プロセスは、実行中のアプリケーションのインスタンスです。コンピュータ上でブラウザなどのアプリケーションを開くと、そのアプリケーションは何らかのプロセスに関連付けられます。プロセスは次のもので構成されます:

  • ハードウェア コンテキスト: 汎用レジスタと CPU 固有のレジスタの内容を保存します
  • ソフトウェアコンテキスト: プロセスによって割り当てられるリソースを指定します
  • アドレス空間: プロセスが属するメモリの領域を指定します

次の画像は、フランシス・マチャドとルイス・マイアの本から抜粋したものです:

Concorrência e paralelismo em Python

この情報はプログラムを実行するために必要です。

スレッドとは何ですか?

スレッドはプログラムのサブルーチンであり、オペレーティング システムが管理する実行の最小単位であり、プロセスのコンポーネントです。

仮想プロセスのさまざまなスレッドは同時に実行でき (これについてはすぐに説明します)、メモリなどのリソースを共有します。異なるプロセスはこれらのリソースを共有しません。

以下の画像は Wikipedia から引用したものです:

Concorrência e paralelismo em Python

上の画像を解釈すると、プログラムはディスク (二次的な不揮発性メモリ) に保存されており、いくつかの命令が含まれており、1 つ以上のプロセスでインスタンス化 (開始) でき、これらのプロセスにはいくつかの関連スレッド。

I/O バウンドと CPU バウンドとは何を意味しますか?

これら 2 つの表現は、競争に関する議論で頻繁に登場し、ポルトガル語では I/O (入出力) と CPU (中央処理装置) について登場することがあります。

I/O バウンドと CPU バウンドについて話すときは、コンピューター上での操作の高速化を妨げる制限要因について話しています。これら 2 種類の操作は同じコードベースで見つけることができます。

CPU バウンド操作は CPU を集中的に使用するため、CPU がより強力であればより高速に実行されます。言い換えれば、クロック速度を 2 GHz から 4 GHz にすると、この操作はおそらくより速く実行されるでしょう。ここでは、多くの計算、計算を実行する操作について話しています。たとえば、円周率の計算方法など。

I/O バウンド操作は、ネットワーク速度と入出力デバイスの速度に依存します。 Web サーバーへのリクエストやディスクからのファイルの読み取りは、I/O バウンド操作です。

どちらのタイプの操作でも同時実行性を使用するとメリットが得られます。

PythonのGILとは何ですか?

GIL は グローバル インタプリタ ロックの略で、Python プロセスが同時に複数の Python 命令バイトコードを実行するのを防ぐことを目的としています。スレッドを実行するには、GIL を「取得」する必要があります。あるスレッドが GIL を保持している間、別のスレッドが同時に GIL を取得することはできません。これは、このコンテキストで複数のスレッドを使用できないという意味ではありません。

ここでは、Python のリファレンス実装を検討します。 CPython は Python の標準実装であり、言語の動作の参考として使用されます。 Jython や IronPython などの他の実装もあります。 GIL は CPython に存在しますが、つい最近、GIL をオプションにすることを提案する PEP (Python Enhancement Proposal) がありました。

GIL の考え方は、複数のスレッドが Python オブジェクトを同時に参照する必要がある場合に発生する可能性がある 競合状態 を防ぐことです。複数のスレッドが共有変数を変更する場合、その変数は予期しない状態になる可能性があります。マシュー・ファウラーの本から引用した画像:

Concorrência e paralelismo em Python

上の画像では、2 つのスレッドが同時に参照カウントを増やそうとしていますが、カウントが 2 になるのではなく、どちらも 1 ずつ増えているため、最終結果は 1 になります (各スレッドは列です)。

競争とは何ですか?

コンピューティングにおける競合は、これら 2 つのタスクをまったく同時に実行する必要はなく、複数のタスクを処理するときに発生します。この件に関するロブ・パイクの有名なフレーズ:

競争とは、同時に多くのことに対処することを意味します。並列処理とは、多くのことを同時に実行することです。

次の仮定の状況について考えてください。ケーキを 2 つ作る場合は、オーブンを予熱することから始めて、その間に 1 つ目のケーキの生地を準備します。オーブンが適切な温度になったら、最初のケーキの生地をオーブンに入れ、ケーキがオーブン内で膨らむのを待っている間に、2 番目のケーキの生地を準備できます。競争の考え方は基本的に次のようなものです。タスクが完了するのを待っている間、アイドル状態になったり、スタックしたり、停止したりする必要はなく、切り替えを行ってタスクを変更することができます。

この文脈では、2 つのタイプのマルチタスクがあります:

  • 協調マルチタスク: このモデルでは、タスクが切り替えできるポイントをコードで説明します。 Python では、これは一般的な設計パターンであるイベント ループを使用し、1 つのスレッドと 1 つの CPU コアのみを使用して実現されます。たとえば、asyncio と async および await を使用します。
  • プリエンプティブ マルチタスク: このモデルでは、オペレーティング システムに スイッチ を処理させます。 Python では、これは、たとえばスレッド ライブラリを使用して、複数のスレッドと 1 つの CPU コアで実現されます。

以下の画像は、Python での同時実行性を要約するのに役立ちます:

Concorrência e paralelismo em Python

並列処理とは何ですか?

並列処理とは、複数のタスクが同時に実行されることを意味します。言い換えれば、並列性は並行性 (複数のタスクを処理する) を意味しますが、同時性は並列性を意味しません (タスクは必ずしも同時に並行して実行されるわけではありません)。並列処理を可能にするには、複数の CPU コアが必要です。

Python では、たとえば、マルチプロセシング ライブラリを使用して並列処理が実現されます。この場合、それぞれが独自の GIL を持つ複数の Python プロセスが存在します。この画像は、Python での並列処理を説明するのに役立ちます:

Concorrência e paralelismo em Python

asyncio ライブラリ

Python で同時実行性と並列処理を実現するにはさまざまな方法があり、処理する操作のタイプ (I/O バウンドまたは CPU バウンド) に応じて、いくつかのライブラリを使用してコードを最適化できます。 asyncio は、async と await を使用して同時実行を実現するための ライブラリです。ドキュメントより:

Asyncio は、高性能ネットワークや Web サーバー、データベース接続ライブラリ、分散ジョブ キューなどを提供するいくつかの非同期 Python フレームワークの基盤として使用されます。

ご想像のとおり、このライブラリは、ネットワーク待機時間やディスクへの書き込みなどがある I/O バウンド タスクの最適化に適しています。 CPU バウンド操作では待機はなく、CPU の計算速度のみに依存します。

スレッドライブラリ

Python のスレッド ライブラリを使用すると、複数のスレッドを操作できます。ただし、依然として 1 つの CPU コアと 1 つの Python プロセスを処理しており、これはオペレーティング システムが実行するプリエンプティブ マルチタスクのケースであることに注意してください。私たちにとってタスクの切り替えです。このライブラリは、I/O バウンド操作の最適化にも役立ちます。

スレッド化については、Real Python Web サイトにいくつかの重要なポイントが記載されています。

あるタスクがいつ停止し、別のタスクが開始されるかはオペレーティング システムによって制御されるため、スレッド間で共有されるデータはすべて保護、つまりスレッド セーフする必要があります。残念ながら、requests.Session() はスレッドセーフではありません。データの内容とその使用方法に応じて、データ アクセスをスレッドセーフにするための戦略がいくつかあります。その 1 つは、スレッドセーフ データ構造を Python キュー モジュールのキューとして使用することです。

キューのドキュメントはここにあります。

マルチプロセッシングライブラリ

Python ドキュメントのマルチプロセッシング ライブラリについて:

multiprocessing は、スレッド モジュールと同様の API を使用してプロセスの生成をサポートするパッケージです。マルチプロセッシング パッケージはローカルとリモートの両方の同時実行性を提供し、スレッドの代わりにサブプロセスを使用することで GIL を効果的にバイパスします。そのため、マルチプロセッシング モジュールを使用すると、プログラマは 1 台のマシン上の複数のプロセッサを利用できるようになります

異なる CPU コアで複数のプロセスを実行することは、GIL を無効にすることを意味するのではなく、各プロセスが独自の GIL を持つことを意味することに注意してください。複数の CPU コアを利用し、使用可能な複数のコア間で重い CPU ワークロードを共有することにより、ライブラリは CPU バウンドにより適しています。


出典:

ファウラー、マシュー。 asyncio による Python 同時実行。マニング出版物、2022 年。

マチャド、フランシス・ベレンジャー;マイア、ルイス・パウロ。オペレーティング システム アーキテクチャ: SOSIM シミュレータを使用した演習と ENADE の質問が含まれます。リオデジャネイロ: LTC、2013.

Wikipedia のスレッド (コンピューティング)

本物の Python による同時実行で Python プログラムを高速化

以上がPython の同時実行性と並列性の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Python Switchステートメントとは何ですか?Python Switchステートメントとは何ですか?Apr 30, 2025 pm 02:08 PM

この記事では、バージョン3.10で導入されたPythonの新しい「マッチ」ステートメントについて説明します。これは、他の言語のスイッチステートメントに相当するものです。コードの読みやすさを向上させ、従来のif-elif-elよりもパフォーマンスの利点を提供します

Pythonの例外グループとは何ですか?Pythonの例外グループとは何ですか?Apr 30, 2025 pm 02:07 PM

Python 3.11の例外グループは、複数の例外を同時に処理することで、同時シナリオと複雑な操作でエラー管理を改善します。

Pythonの関数注釈とは何ですか?Pythonの関数注釈とは何ですか?Apr 30, 2025 pm 02:06 PM

Pythonの関数注釈は、タイプチェック、ドキュメント、およびIDEサポートの関数にメタデータを追加します。それらはコードの読みやすさ、メンテナンスを強化し、API開発、データサイエンス、ライブラリの作成において重要です。

Pythonのユニットテストとは何ですか?Pythonのユニットテストとは何ですか?Apr 30, 2025 pm 02:05 PM

この記事では、Pythonの単体テスト、その利点、およびそれらを効果的に書く方法について説明します。テスト用のUnittestやPytestなどのツールを強調しています。

Pythonのアクセス仕様とは何ですか?Pythonのアクセス仕様とは何ですか?Apr 30, 2025 pm 02:03 PM

記事では、Pythonのアクセス仕様について説明します。Pythonは、厳格な執行ではなく、クラスメンバーの可視性を示すために命名規則を使用します。

Pythonの__init __()とは何ですか?また、セルフはどのように役割を果たしますか?Pythonの__init __()とは何ですか?また、セルフはどのように役割を果たしますか?Apr 30, 2025 pm 02:02 PM

記事では、Pythonの\ _ \ _ init \ _ \ _()メソッドと、オブジェクト属性の初期化における自己の役割について説明します。 \ _ \ _ init \ _ \ _()に対するその他のクラス方法と継承の影響についてもカバーされています。

Pythonの@ClassMethod、@StaticMethod、およびインスタンスメソッドの違いは何ですか?Pythonの@ClassMethod、@StaticMethod、およびインスタンスメソッドの違いは何ですか?Apr 30, 2025 pm 02:01 PM

この記事では、@ClassMethod、@StaticMethod、およびPythonのインスタンスメソッドの違いについて説明し、そのプロパティ、ユースケース、および利点を詳述します。必要な機能とDAに基づいて適切な方法タイプを選択する方法を説明します

Pythonアレイに要素をどのように追加しますか?Pythonアレイに要素をどのように追加しますか?Apr 30, 2025 am 12:19 AM

inpython、youappendelementStoalistusingtheappend()method.1)useappend()forsingleelements:my_list.append(4).2)useextend()or = formultipleElements:my_list.extend(another_list)ormy_list = [4,5,6] .3)forspecificpositions:my_list.insert(1,5).beaware

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。