ホームページ バックエンド開発 Python チュートリアル Python マルチスレッドとスレッド ロックの簡単な理解 (コード)

Python マルチスレッドとスレッド ロックの簡単な理解 (コード)

Sep 14, 2018 pm 05:16 PM
Pythonマルチスレッド

この記事は、Python のマルチスレッドとスレッド ロックを簡単に理解 (コード) するものです。一定の参考価値があります。困っている友人は参照してください。お役に立てれば幸いです。

マルチスレッド スレッドモジュール スレッドの作成 独自のスレッドクラスの作成 スレッド通信 スレッド同期 相互排除メソッド スレッドロック @理解する必要があります! ! !

マルチスレッド

スレッドとは何ですか?

スレッドは、コンピュータのマルチコア リソースを使用してプログラムの同時実行を完了できるマルチタスク プログラミング方法でもあります。

スレッドは軽量プロセスとも呼ばれます

スレッドの特徴

スレッドはコンピュータのマルチコアによって割り当てられる最小単位です

プロセスには複数のスレッドを含めることができます

スレッドは、コンピュータ リソースを消費する実行中のプロセスでもあります。複数のスレッドがプロセスのリソースとスペースを共有します

スレッドの作成と削除は、プロセスよりもはるかに少ないリソースを消費します

複数のスレッドの実行は互いに干渉しません

#スレッドには、命令セット ID などの独自の属性もあります

スレッド化モジュールはスレッドを作成します

t =threading.Thread( )

name: スレッド名、空の場合のデフォルト値、Tread-1、Tread-2、Tread-3

target: スレッド関数

args : 要素グループ、位置に従ってスレッド関数にパラメータを渡します

kwargs: 辞書、キー値に従って郡関数にパラメータを渡します

関数: スレッド オブジェクトを作成します

パラメータ

t.start(): スレッドを開始し、スレッド関数を自動的に実行します。

t.join([timeout]): プロセスをリサイクルします

t.is_alive( ): スレッドのステータスを表示します

t.name(): スレッド名を表示します

t.setName(): スレッド名を設定します

t.daemon 属性: Byデフォルトでは、メイン スレッドは終了し、ブランチ スレッドの実行継続には影響しません。If True に設定すると、ブランチ スレッドはメイン スレッド

t.daemon = True

t とともに終了します。 setDaemon(Ture)

メソッドの設定

#!/usr/bin/env python3
from threading import Thread
from time import sleep
import os
# 创建线程函数
def music():
    sleep(2)
    print("分支线程")

t = Thread(target = music)
# t.start()   # ******************************
print("主线程结束---------")

'''没有设置的打印结果
主线程结束---------
分支线程
'''

'''设置为True打印结果
主线程结束---------
'''
ログイン後にコピー

threading .currentThread: 現在のスレッド オブジェクトを取得します

@ここのコードは、子スレッドが同じプロセス内で変数を共有することを示しています

#!/usr/bin/env python3

from threading import Thread
from time import sleep
import os

# スレッド関数の作成
def music() :
グローバル a
print("a=",a)
a = 10000
for i in range(5):
sleep(1)
print("1212")

a = 1
t = Thread(target = music)
t.start()
t.join()
print("メインスレッドのa =", a) 独自のスレッド クラスを作成します

検査ポイント: クラスの使用、親クラスの呼び出し__init__ メソッド、関数 *パラメータ受け渡しおよび **パラメーター受け渡し


from threading import Thread
import time

class MyThread(Thread):
    name1 = 'MyThread-1'
    def __init__(self,target,args=(), kwargs={}, name = 'MyThread-1'):
        super().__init__()
        self.name = name
        self.target = target
        self.args = args
        self.kwargs = kwargs
    def run(self):
        self.target(*self.args,**self.kwargs)

def player(song,sec):
    for i in range(2):
        print("播放 %s:%s"%(song,time.ctime()))
        time.sleep(sec)

t =MyThread(target = player, args = ('亮亮',2))

t.start()
t.join()
ログイン後にコピー

スレッド通信

通信方法: 複数のスレッドがプロセス空間のメモリを共有するため、スレッド間の通信はグローバル変数を使用して完了できます

注: スレッド間でグローバル変数を使用する場合スレッドの場合、通信のセキュリティを確保するために同期相互排他メカニズムが必要になることがよくあります。

スレッド同期相互排他メソッド

event

e = threading.Event():イベント オブジェクト

e.wait([timeout]): ステータスを設定します。設定されている場合、この関数はブロックされ、タイムアウトはタイムアウト時間です。

e.set: 変更e を設定状態にします

e.clear: 設定状態を削除します


import threading
from time import sleep

def fun1():
    print("bar拜山头")
    global s
    s = "天王盖地虎"

def fun2():
    sleep(4)
    global s
    print("我把限制解除了")
    e.set()     # 解除限制,释放资源

def fun3():
    e.wait() # 检测限制
    print("说出口令")
    global s
    if s == "天王盖地虎":
        print("宝塔镇河妖,自己人")
    else:
        print("打死他")
    s = "哈哈哈哈哈哈"

# 创建同步互斥对象
e = threading.Event()
# 创建新线程
f1 = threading.Thread(target = fun1)
f3 = threading.Thread(target = fun3)
f2 = threading.Thread(target = fun2)
# 开启线程
f1.start()
f3.start()
f2.start()
#准备回收
f1.join()
f3.join()
f2.join()
ログイン後にコピー

スレッドロック

lock = threading.Lock() : ロック オブジェクトの作成

lock.acquire(): ロック

lock.release(): ロック解除

また、 with を使用してロックすることもできます。

1 with lock:
2     ...
3     ...
ログイン後にコピー

知っておく必要があります! ! !

Python スレッド (グローバル インタプリタ) に関する GIL の問題:

python---->マルチスレッドのサポート---->同期の相互排他の問題---->追加ロック ソリューション----> スーパー ロック (インタープリタをロック)----> インタプリタは同時に 1 つのスレッドのみを解釈できます---> 効率の低下につながります

結果:

インタプリタは一度に 1 つのスレッドしか解釈して実行できないため、Python スレッドの効率は低くなります。ただし、IO ブロックが発生すると、スレッドは積極的にインタプリタを放棄するため、Python スレッドはより適しています。高レイテンシ IO プログラムの同時実行

##解決策

同時実行を完了するプロセスを使用してみてください (言及されていないものと同じ)

C インタープリターの使用は適切ではありません (使用C#、JAVA)

使用してみる 複数のソリューションを組み合わせて同時操作が実行され、スレッドが高遅延 IO

として使用されます。

以上が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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? Apr 01, 2025 pm 05:09 PM

LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? Apr 01, 2025 pm 11:15 PM

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

人気のあるPythonライブラリとその用途は何ですか? 人気のあるPythonライブラリとその用途は何ですか? Mar 21, 2025 pm 06:46 PM

この記事では、numpy、pandas、matplotlib、scikit-learn、tensorflow、django、flask、and requestsなどの人気のあるPythonライブラリについて説明し、科学的コンピューティング、データ分析、視覚化、機械学習、Web開発、Hの使用について説明します。

uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? Apr 01, 2025 pm 10:51 PM

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? 文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? Apr 01, 2025 pm 11:18 PM

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...

プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? Apr 02, 2025 am 07:18 AM

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

正規表現とは何ですか? 正規表現とは何ですか? Mar 20, 2025 pm 06:25 PM

正規表現は、プログラミングにおけるパターンマッチングとテキスト操作のための強力なツールであり、さまざまなアプリケーションにわたるテキスト処理の効率を高めます。

See all articles