ホームページ >バックエンド開発 >Python チュートリアル >Pythonスレッドの作成と一般的な方法(詳細例)

Pythonスレッドの作成と一般的な方法(詳細例)

WBOY
WBOY転載
2022-05-06 18:41:183559ブラウズ

この記事では、python に関する知識を紹介します。主にスレッドの作成方法や一般的な方法、スレッドのデモ事例などを紹介します。一緒に見ていきましょう。皆様のお役に立てれば幸いです。 。

Pythonスレッドの作成と一般的な方法(詳細例)

推奨学習: Python ビデオ チュートリアル

スレッドの作成と使用

Python には多数のマルチスレッド モジュールがあり、その中でも threading モジュールがより一般的に使用されます。 threading を使用してスレッドを作成する方法とその一般的なメソッドを見てみましょう。

#スレッド作成-スレッド化

##関数名#Thread#スレッドの作成##Thread(target, args)##Thread の運動エネルギー: モジュールの Thread クラスを呼び出してスレッド オブジェクトをインスタンス化します。これには 2 つのパラメータ:
はじめに
概要threading
target と args## があります。 # (プロセス作成時と同じパラメータ)。

target はスレッドの作成時に実行される関数であり、args はこの関数の実行時に渡す必要があるパラメーターです。 スレッド オブジェクトの共通メソッド スレッド オブジェクトの共通メソッドを見てみましょう:

関数名

概要
使い方start()
##start スレッドを開始します
join スレッドの実行が終了するまでスレッドをブロックします join(timeout=None)
getName スレッドの名前を取得します getName()
setName スレッドの名前を設定します setName(name)
is_alive スレッドが生きているかどうかを確認します is_alive()
setDaemon デーモン スレッド setDaemon(True)
  • start 関数: スレッドを開始します。戻り値やパラメーターはありません。
  • join 関数: プロセス内の join 関数と同じです。現在のプログラムをブロックするため、メインスレッドのタスクは、実行を続ける前に現在のサブスレッドのタスクが終了するまで待つ必要があります。パラメータは次のとおりです。 timeout: ブロッキング タイムアウトを表します。
  • getName 関数: 現在のスレッドの名前を取得します。
  • setName 関数: 現在のスレッドの名前を設定します。パラメータは name: 文字列型です
  • is_alive 関数: 現在のスレッドのステータスが正しいかどうかを判断します在庫あり
  • setDaemon関数: デーモンスレッドなので、プロセスプールが業務を完了していなくても、スクリプトタスクが完了すると強制終了されます。子スレッドにも同じことが当てはまります。メイン プロセスまたはメイン スレッドが最初に独自の処理を終了し、子スレッドが強制的に閉じられるのではなく動作を継続できるようにしたい場合は、setDaemon( を設定するだけで済みます。 ) から 本当の 以上です。

PS: 上記の紹介から、スレッド オブジェクトの関数はプロセス オブジェクトの関数とほぼよく似ており、使用方法や使用シナリオもほぼ同じであることがわかります。

# スレッドのデモ ケース

# シングルスレッドの初期ケース

#デモ

マルチスレッドの前

まず次のケースを見て、実行後に合計どれくらいの時間がかかったかを見てみましょう

1. リストを定義し、その中にコンテンツを書き込みます。

2. 新しいリストを定義し、前のリストの内容を新しいリストにランダムに書き込み、ランダムに取得した内容を前のリストから削除します。

3.

r andom

組み込みモジュール

コード例は次のとおりです:
# coding:utf-8import timeimport random


old_lists = ['罗马假日', '怦然心动', '时空恋旅人', '天使爱美丽', '天使之城', '倒霉爱神', '爱乐之城']new_lists = []def work():
    if len(old_lists) == 0:     # 判断 old_list 的长度,如果为0 ,则表示 该列表的内容已经被删光了
        return '\'old_list\' 列表内容已经全部删除'
    old_choice_data = random.choice(old_lists)      # random 模块的 choice函数可以随机获取传入的 old_list 的元素
    old_lists.remove(old_choice_data)               # 当获取到这个随机元素之后,将该元素从 old_lists 中删除
    new_choice_data = '%s_new' % old_choice_data    # 将随机获取到的随机元素通过格式化方式重新赋值,区别于之前的元素
    new_lists.append(new_choice_data)               # 将格式化的新的随机元素添加至 new_lists 列表

    time.sleep(1)if __name__ == '__main__':
    strat_time = time.time()

    for i in range(len(old_lists)):
        work()

    if len(old_lists) ==0:
        print('\'old_lists\' 当前为:{}'.format(None))
    else:
        print(('\'old_lists\' 当前为:{}'.format(old_lists)))

    if not len(new_lists) == 0:
        print(('\'new_lists\' 当前为:{}'.format(new_lists)))
    else:
        print('\'new_lists\' 当前为:{}'.format(None))

    end_time = time.time()
    print('运行结束,累计耗时:{} 秒'.format(end_time - strat_time))

実行結果


Pythonスレッドの作成と一般的な方法(詳細例)実行中の出力結果から、スクリプト全体の実行に 7 秒かかることがわかります。リスト内の要素はフォーマットされて追加されました

_new

; それだけでなく、random モジュールの選択関数 により、new_lists の内容の順序も異なります。 old_lists; each 実行順序は毎回異なるため、old_lists の順序は保証できません。 マルチスレッドのデモ ケース

コード例は次のとおりです:
# coding:utf-8import timeimport randomimport threading


old_lists = ['罗马假日', '怦然心动', '时空恋旅人', '天使爱美丽', '天使之城', '倒霉爱神', '爱乐之城']new_lists = []def work():
    if len(old_lists) == 0:     # 判断 old_list 的长度,如果为0 ,则表示 该列表的内容已经被删光了
        return '\'old_list\' 列表内容已经全部删除'
    old_choice_data = random.choice(old_lists)      # random 模块的 choice函数可以随机获取传入的 old_list 的元素
    old_lists.remove(old_choice_data)               # 当获取到这个随机元素之后,将该元素从 old_lists 中删除
    new_choice_data = '%s_new' % old_choice_data    # 将随机获取到的随机元素通过格式化方式重新赋值,区别于之前的元素
    new_lists.append(new_choice_data)               # 将格式化的新的随机元素添加至 new_lists 列表

    time.sleep(1)if __name__ == '__main__':
    strat_time = time.time()

    print('\'old_lists\'初始长度为:{}'.format(len(old_lists)))	# 获取 old_lists 与 new_lists 最初始的长度
    print('\'new_lists\'初始长度为:{}'.format(len(new_lists)))
    thread_list = []        # 定义一个空的 thread_list 对象,用以下方添加每个线程

    for i in range(len(old_lists)):
        thread_work = threading.Thread(target=work)     # 定义一个线程实例化对象执行 work 函数,因为 work 函数没有参数所以不用传 args
        thread_list.append(thread_work)                 # 将 thread_work 添加进 thread_list
        thread_work.start()                             # 启动每一个线程

    for t in thread_list:   # 通过for循环将每一个线程进行阻塞
        t.join()

    if len(old_lists) ==0:
        print('\'old_lists\' 当前为:{}'.format(None), '当前长度为:{}'.format(len(old_lists)))
    else:
        print(('\'old_lists\' 当前为:{}'.format(old_lists)))

    if not len(new_lists) == 0:
        print('\'new_lists\' 当前长度为:{}'.format(len(new_lists)))
        print('\'new_lists\' 当前的值为:{}'.format(new_lists))
    else:
        print('\'new_lists\' 当前为:{}'.format(None))

    end_time = time.time()
    print('运行结束,累计耗时:{} 秒'.format(end_time - strat_time))

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


実行結果から判断すると、最初のシングルスレッド タスクには 7 秒かかりましたが、マルチスレッドを使用した後は完了までに 1 秒しかかからず、作業効率が大幅に向上しました。 Pythonスレッドの作成と一般的な方法(詳細例)

スレッドの問題

上記の演習を通じて、スレッドの使用法がプロセスの使用法とほぼ同じであることがわかりました。これらはすべて、互いに干渉することなくプログラムを実行でき、メインスレッドのプログラムがサブスレッドのタスクの完了を待ってから実行することを防ぐこともできます。先ほどのデモンストレーションのケースでは、
join()

関数を使用してブロックしましたが、ここで

join()

を削除すると、実行効果を確認できます。 プロセスと同様、スレッドにも特定の問題があります。

スレッドによって実行された関数も戻り値を取得できません。

複数のスレッドがファイルを同時に変更すると、変更されたファイルのデータも混乱します (特にトランザクション シナリオを扱う場合、すべてのスレッドが同時にファイルを操作するため、料金を支払う必要があります)特別な注意)。
  • これらのスレッドに存在する問題も解決できますので、次の章
  • スレッド プールとグローバル ロック
  • で詳しく紹介します。

推奨学習: Python ビデオ チュートリアル

以上がPythonスレッドの作成と一般的な方法(詳細例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。