目次
プロセス コミュニケーションとは
キューの作成 - マルチプロセッシング
プロセス間通信 - キューのデモ ケース
send 関数にデータをバッチで追加します。
セクション
プロセス間通信のその他の方法 - 補足
ホームページ バックエンド開発 Python チュートリアル Pythonのプロセス間の通信方法は何ですか?

Pythonのプロセス間の通信方法は何ですか?

Jun 03, 2023 pm 02:09 PM
python

プロセス コミュニケーションとは

ここにコミュニケーション メカニズムの例を示します。コミュニケーションという言葉は誰もがよく知っています。たとえば、ある人がガールフレンドに電話したいと考えています。呼び出しが確立されると、暗黙的なキュー (この用語に注意してください) が形成されます。このとき、この人は対話を通じて彼女に情報を伝え続け、この人の彼女も聞いています。おそらくほとんどの場合はその逆だと思います。

この 2 つは 2 つのプロセスに例えることができます。「この人」のプロセスは「彼女」のプロセスに情報を送信する必要があるため、キューの助けが必要です。ガールフレンドは常にキュー内の情報を受信する必要があるため、同時に他のことを行うことができます。これは、2 つのプロセス間の通信が主にキューに依存していることを意味します。

このキューはメッセージの送受信をサポートできます。「この人」はメッセージの送信を担当し、「ガールフレンド」はメッセージの受信を担当します。

キューに焦点を当てているので、キューの作成方法を見てみましょう。

キューの作成 - マルチプロセッシング

マルチプロセッシング モジュールを引き続き使用し、このモジュールの Queue 関数を呼び出してキューを作成します。

#関数名概要パラメータ戻り値Queueキューの作成mac_countキュー オブジェクト
キュー関数の概要: Queue を呼び出してキューを作成します。キュー内に作成できるメッセージの最大数を表すパラメータ mac_count があり、渡されない場合、デフォルトの長さは無制限になります。キューオブジェクトをインスタンス化した後、キューオブジェクトを操作してデータの出し入れを行う必要があります。

プロセス間通信メソッド

関数名はじめにパラメータ戻り値#put# #getキュー メッセージの取得#str

put 関数の概要: データを渡します。これには、文字列型のパラメーター メッセージが 1 つあります。

get 関数の概要: キュー内のデータを受信するために使用されます。 (実際、これは一般的な json シナリオです。多くのデータ送信は文字列です。キューの挿入と取得には文字列が使用されるため、json はこのシナリオに非常に適しています。)

次のステップは、キューの使用を練習してみましょう。

プロセス間通信 - キューのデモ ケース

コード例は次のとおりです。

# coding:utf-8


import json
import multiprocessing


class Work(object):     # 定义一个 Work 类
    def __init__(self, queue):      # 构造函数传入一个 '队列对象' --> queue
            self.queue = queue

    def send(self, message):        # 定义一个 send(发送) 函数,传入 message
                                    # [这里有个隐藏的bug,就是只判断了传入的是否字符串类型;如果传入的是函数、类、集合等依然会报错]
        if not isinstance(message, str):    # 判断传入的 message 是否为字符串,若不是,则进行 json 序列化
            message = json.dumps(message)
        self.queue.put(message)     # 利用 queue 的队列实例化对象将 message 发送出去

    def receive(self):      # 定义一个 receive(接收) 函数,不需传入参数,但是因为接收是一个源源不断的过程,所以需要使用 while 循环
        while 1:
            result = self.queue.get()   # 获取 '队列对象' --> queue 传入的message
                                        # 由于我们接收的 message 可能不是一个字符串,所以要进程异常的捕获
            try:                        # 如果传入的 message 符合 JSON 格式将赋值给 res ;若不符合,则直接使用 result 赋值 res
                res = json.loads(result)
            except:
                res = result
            print('接收到的信息为:{}'.format(res))


if __name__ == '__main__':
    queue = multiprocessing.Queue()
    work = Work(queue)
    send = multiprocessing.Process(target=work.send, args=({'message': '这是一条测试的消息'},))
    receive = multiprocessing.Process(target=work.receive)

    send.start()
    receive.start()
ログイン後にコピー

キューを使用してプロセス間通信を確立するときに例外が発生しました

しかし、ここでは以下に示すようなエラー メッセージが表示されます:

エラー スクリーンショットの例は次のとおりです:

Pythonのプロセス間の通信方法は何ですか?

ここでのエラー メッセージは、ファイルがは見つかりませんでした。実際、キューを使用して put() と get() を実行すると、目に見えないロックが追加されます。これは、上の図の円内の .SemLock です。このエラーの具体的な原因を気にする必要はなく、この問題を解決するのは実際には非常に簡単です。

FileNotFoundError: [Errno 2] そのようなファイルまたはディレクトリはありません例外解決策

プロセスをブロックする必要があるのは、送信または受信サブプロセスの 1 つだけです。そのうちの 1 つをブロックするだけです。 . これが理論上の状況です。ただし、受信サブプロセスは while ループであり、常に実行されるため、送信サブプロセスに結合を追加するだけで済みます。

解決図は次のとおりです。

Pythonのプロセス間の通信方法は何ですか?

PS: エラーの問題は解決されましたが、プログラムは正常に終了しませんでした。

実際、受信プロセスは while ループであるため、いつ処理されるかわかりませんし、すぐに終了する方法もありません。したがって、受信プロセスで terminate() 関数を使用して受信側を終了する必要があります。

実行結果は次のとおりです。

Pythonのプロセス間の通信方法は何ですか?

send 関数にデータをバッチで追加します。

新しい関数を作成して、メッセージ送信のためのバッチ追加をシミュレートする for ループ

次に、バッチでのデータ送信をシミュレートするスレッドをこの関数に追加します。

サンプル コードは次のとおりです。

# coding:utf-8


import json
import time
import multiprocessing


class Work(object):     # 定义一个 Work 类
    def __init__(self, queue):      # 构造函数传入一个 '队列对象' --> queue
            self.queue = queue

    def send(self, message):        # 定义一个 send(发送) 函数,传入 message
                                    # [这里有个隐藏的bug,就是只判断了传入的是否字符串类型;如果传入的是函数、类、集合等依然会报错]
        if not isinstance(message, str):    # 判断传入的 message 是否为字符串,若不是,则进行 json 序列化
            message = json.dumps(message)
        self.queue.put(message)     # 利用 queue 的队列实例化对象将 message 发送出去


    def send_all(self):             # 定义一个 send_all(发送)函数,然后通过for循环模拟批量发送的 message
        for i in range(20):
            self.queue.put('第 {} 次循环,发送的消息为:{}'.format(i, i))
            time.sleep(1)



    def receive(self):      # 定义一个 receive(接收) 函数,不需传入参数,但是因为接收是一个源源不断的过程,所以需要使用 while 循环
        while 1:
            result = self.queue.get()   # 获取 '队列对象' --> queue 传入的message
                                        # 由于我们接收的 message 可能不是一个字符串,所以要进程异常的捕获
            try:                        # 如果传入的 message 符合 JSON 格式将赋值给 res ;若不符合,则直接使用 result 赋值 res
                res = json.loads(result)
            except:
                res = result
            print('接收到的信息为:{}'.format(res))


if __name__ == '__main__':
    queue = multiprocessing.Queue()
    work = Work(queue)
    send = multiprocessing.Process(target=work.send, args=({'message': '这是一条测试的消息'},))
    receive = multiprocessing.Process(target=work.receive)
    send_all = multiprocessing.Process(target=work.send_all,)


    send_all.start()    # 这里因为 send 只执行了1次,然后就结束了。而 send_all 却要循环20次,它的执行时间是最长的,信息也是发送的最多的
    send.start()
    receive.start()

    # send.join()       # 使用 send 的阻塞会造成 send_all 循环还未结束 ,receive.terminate() 函数接收端就会终结。
    send_all.join()     # 所以我们只需要阻塞最长使用率的进程就可以了
    receive.terminate()
ログイン後にコピー

実行結果は次のとおりです。

Pythonのプロセス間の通信方法は何ですか?

上の図から、 2 つのプロセス send と send_all インスタンス化された queue の Queue オブジェクトを介してメッセージを送信でき、同じ受信関数によって 2 つのプロセスによって渡されたメッセージも出力されます。

セクション

この章では、キューを使用してプロセス間通信を実現することに成功し、キューの操作スキルも習得しました。キューでは、一方の端 (ここでは送信側を示しています) が put メソッドを通じて関連情報を追加し、もう一方の端が get メソッドを使用して関連情報を取得します。2 つのプロセスは相互に連携して 1 つのプロセスの効果を達成します。コミュニケーション。

キューに加えて、プロセスはパイプ、セマフォ、共有メモリを使用して通信することもできます。興味がある場合は、これらの方法について学ぶことができます。自分で拡張することもできます。

プロセス間通信のその他の方法 - 補足

Python は、シグナル、パイプ、メッセージ キュー、セマフォ、共有メモリ、ソケットなどを含む、プロセス間で通信するためのさまざまな方法を提供します。

##大きく分けて Queue と Pipe の 2 つのメソッドがあり、Queue は複数のプロセス間の通信を実現するために使用され、Pipe は 2 つのプロセス間の通信を実現します。

1. パイプ: 匿名パイプと名前付きパイプに分けられます

匿名パイプ: カーネル内の固定サイズのバッファに適用されます。プログラムは書き込みと読み取りの権限を持ちます。一般に、fockを使用します。親プロセスと子プロセス間の通信を実装する関数です。

名前付きパイプ: メモリ上の固定サイズのバッファを適用します。プログラムは書き込みと読み取りの権限を持ちます。血のつながりのないプロセス間でも通信できます。プロセス間

特長: バイトストリーム指向、ライフサイクルはカーネルに従う、同期相互排他機構内蔵、半二重一方向通信、2本のパイプで双方向通信を実現

#1 つの書き換え方法は次のとおりです: 運用中 システム カーネル内にキューが確立され、複数のデータグラム要素が含まれており、複数のプロセスが特定のハンドルを介してキューにアクセスできます。メッセージ キューを使用して、あるプロセスから別のプロセスにデータを送信できます。各データ ブロックにはタイプがあるとみなされ、受信プロセスによって受信されるデータ ブロックは異なるタイプを持つ可能性があります。メッセージ キューにもパイプと同じ欠点があります。つまり、各メッセージの最大長には上限があり、各メッセージ キューの合計バイト数には上限があり、メッセージ キューの合計バイト数にも上限があります。システム上のメッセージ キューの総数

特徴: メッセージ キューはグローバル リンク リストとして考えることができます。リンク リスト ノードはデータグラムのタイプと内容を保存し、メッセージの識別子でマークされます。キュー; メッセージ キューを使用すると、1 つ以上のプロセスがメッセージの書き込みまたは読み取りを行うことができます。メッセージ キューのライフ サイクルはカーネルによって異なります。メッセージ キューは双方向通信を実現できます

3. セマフォ: カーネル内にセマフォ コレクション (基本的に配列) を作成します。配列 (セマフォ) の要素はすべて 1 です。-1 を実行するには P 演算を使用し、1 を実行するには V 演算を使用します。

P(sv): sv の値が 0 より大きい場合は 1 減算し、値が 0 の場合はプログラムの実行を一時停止します

V(sv): 他にある場合SV を待っているプロセスが一時停止されている場合は、実行を再開します。SV を待っているためにプロセスが一時停止されていない場合は、それに 1 を追加します。

PV 操作は、相互排他を実現するために同じプロセスに使用されます。同期を実現するプロセス

機能: 重要なリソースを保護

4. 共有メモリ: 同じ物理メモリを異なるプロセスの仮想アドレス空間にマッピングして、同期を実現します。異なるプロセス間の同期 同じリソースの共有。プロセス間通信方法に関しては、共有メモリが IPC の最も便利で最速の形式であると言えます。

特徴: ユーザー モードからカーネル モードへのデータの頻繁な切り替えやコピーとは異なり、データを直接読み取ります。メモリ それは問題ありません。共有メモリは重要なリソースであるため、操作が必要な場合にはアトミック性が保証される必要があります。セマフォまたはミューテックス ロックを使用できます。

メッセージをキューに入れる message なし
#None

以上がPythonのプロセス間の通信方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPおよびPython:さまざまなパラダイムが説明されています PHPおよびPython:さまざまなパラダイムが説明されています Apr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPとPythonの選択:ガイド PHPとPythonの選択:ガイド Apr 18, 2025 am 12:24 AM

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

PHPとPython:彼らの歴史を深く掘り下げます PHPとPython:彼らの歴史を深く掘り下げます Apr 18, 2025 am 12:25 AM

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

Windows 8でコードを実行できます Windows 8でコードを実行できます Apr 15, 2025 pm 07:24 PM

VSコードはWindows 8で実行できますが、エクスペリエンスは大きくない場合があります。まず、システムが最新のパッチに更新されていることを確認してから、システムアーキテクチャに一致するVSコードインストールパッケージをダウンロードして、プロンプトとしてインストールします。インストール後、一部の拡張機能はWindows 8と互換性があり、代替拡張機能を探すか、仮想マシンで新しいWindowsシステムを使用する必要があることに注意してください。必要な拡張機能をインストールして、適切に動作するかどうかを確認します。 Windows 8ではVSコードは実行可能ですが、開発エクスペリエンスとセキュリティを向上させるために、新しいWindowsシステムにアップグレードすることをお勧めします。

Visual StudioコードはPythonで使用できますか Visual StudioコードはPythonで使用できますか Apr 15, 2025 pm 08:18 PM

VSコードはPythonの書き込みに使用でき、Pythonアプリケーションを開発するための理想的なツールになる多くの機能を提供できます。ユーザーは以下を可能にします。Python拡張機能をインストールして、コードの完了、構文の強調表示、デバッグなどの関数を取得できます。デバッガーを使用して、コードを段階的に追跡し、エラーを見つけて修正します。バージョンコントロールのためにGitを統合します。コードフォーマットツールを使用して、コードの一貫性を維持します。糸くずツールを使用して、事前に潜在的な問題を発見します。

ターミナルVSCODEでプログラムを実行する方法 ターミナルVSCODEでプログラムを実行する方法 Apr 15, 2025 pm 06:42 PM

VSコードでは、次の手順を通じて端末でプログラムを実行できます。コードを準備し、統合端子を開き、コードディレクトリが端末作業ディレクトリと一致していることを確認します。プログラミング言語(pythonのpython your_file_name.pyなど)に従って実行コマンドを選択して、それが正常に実行されるかどうかを確認し、エラーを解決します。デバッガーを使用して、デバッグ効率を向上させます。

VSCODE拡張機能は悪意がありますか? VSCODE拡張機能は悪意がありますか? Apr 15, 2025 pm 07:57 PM

VSコード拡張機能は、悪意のあるコードの隠れ、脆弱性の活用、合法的な拡張機能としての自慰行為など、悪意のあるリスクを引き起こします。悪意のある拡張機能を識別する方法には、パブリッシャーのチェック、コメントの読み取り、コードのチェック、およびインストールに注意してください。セキュリティ対策には、セキュリティ認識、良好な習慣、定期的な更新、ウイルス対策ソフトウェアも含まれます。

See all articles