Pythonの基礎 - マルチスレッド(上)

前回のプロセス少し知識、人気の理解は、このプロセスはOSにああして各プログラムを「監視対象」であることをプロセスに、少なくとも、リソースのスケジューリング割り当ての基本単位のためのオペレーティングシステム(OS)である。そして、周りのマルチプロセス、もちろん、メッセージキュー、このプロセスプールを介してメインプロセスの守護者、...探求と共有グローバル変数、偏ったアプリケーション、複数のタスクのローカル処理が時折も自分自身を動作しますが、複数のプロセスを取得するために優先順位を(主に会社のコンピュータ泥棒強い、私はマルチプロセスを取得するつもりです、それは資源の無駄である必要ハハ...)。

処理し、自分の手書きはいけないし、それを、(scrapyがマルチスレッドのために有用である前に、爬虫類を除く)は、基本的に、使用されることはありません。私たちのほとんどはPythonインタプリタが使用しているので、なぜ、それを処理するために優先順位を与えることを好むだろうCPythonの。それは、デフォルトでは、実際には、我々が設定したブロック、および1つは、マルチスレッドで達成することが本当にできない事実CPythonの中でマルチスレッド ..私は話すことはありません...

しかし、また、人気のある言葉を理解する、という観点からプロセス(プログラム)は、少なくとも一つのプロセスが存在するプロセスおよびスレッドは、それが1として見ることができる:nの関係。

OSスケジューリング、複数のプロセス、複数のスレッドで各「量」の関係があることが理解されます。

シングルスレッド

、コードの観点から順に実行されるコードの一部は、単一プロセスです。

import time


# 我每天下班之后首先是: 煮饭, 做菜
def cook_rice():
    for i in range(3):
        print(f"cook rice ...{i}")
        time.sleep(1)


def cook_dishes():
    for i in range(4):
        print(f"cook dishes...{i}")
        time.sleep(0.5)


if __name__ == '__main__':
    cook_rice()
    cook_dishes()
cook rice ...0
cook rice ...1
cook rice ...2
cook dishes...0
cook dishes...1
cook dishes...2
cook dishes...3

これは真実がさ?真実はこの事で、まず、調理、その後、調理する。我々は何の問題も欲しい結果である...しかし、私は最初、私がするために着手したものをいくつかの音楽に乗せて、コンピュータの電源を入れ、米プラグイン野菜、野菜これらの事

可視本当にそれはまた、マルチタスクが以前の生活の視点から、それを言及している、これは非常に自然なことです。このプログラムのために調理し、私は実際に同時に行うことができるということである。そして、私は常にポイントはつまり書き込みコード本質的には、現実とシミュレーションの抽象的な世界は。そのため、日々直面しなければならない基本的な事柄を調理する野菜は、から同じプログラムでは、自然は、Pythonの基礎として分類されています。

マルチスレッド

ああ、料理と一緒に取得することができ、調理波を証明するために、組み込みのPythonのスレッドモジュールでもクラスを通します。

import time
import threading


# 我每天下班之后首先是: 煮饭, 做菜
def cook_rice():
    for i in range(3):
        print(f"cook rice ...{i}")
        time.sleep(1)


def cook_dishes():
    for i in range(4):
        print(f"cook dishes...{i}")
        time.sleep(0.5)


if __name__ == '__main__':

    # 假设就各创一个线程来弄
    t1 = threading.Thread(target=cook_rice)
    t2 = threading.Thread(target=cook_dishes)

    # 启动多线程
    t1.start()
    t2.start()
cook rice ...0
cook dishes...0
cook dishes...1
cook rice ...1
cook dishes...2
cook dishes...3
cook rice ...2

あなたは、プロセスは、「タスクスケジューラ」を作るの複数のプロセスは、あなたが、ああ、複数のスレッドがそれを実行するために、ここではスレッドという用語過程で「スイッチ」に続けていることがわかります。(実際には、実際には複数のないスレッドを)実行されますが、あまりにも速いCPUをスケジュールします。

すべての子スレッドの待機 - メインスレッド

マルチプロセスが同じであると、メインスレッドは、デフォルトではすべての子プロセスを待ちます、すべての終了後に、プログラムが実際に終了します。

そして、マスの参加は、2つの方法で、同じである、スレッドを作成*引数と** kwargsから。これらは何も、ライン上のおおよその印象ではない、とプロセスが書き込みに、Baiduは理解したいと思いますどのように、より多くの重要な特性です。

import time
import threading


# 我每天下班之后首先是: 煮饭, 做菜
def cook_rice(n):
    for i in range(n):
        print(f"cook rice ...{i}")
        time.sleep(1)


def cook_dishes(n):
    for i in range(n):
        print(f"cook dishes...{i}")
        time.sleep(0.5)


if __name__ == '__main__':

    # 假设就各创一个线程来弄
    t1 = threading.Thread(target=cook_rice, args=(3,))
    t2 = threading.Thread(target=cook_dishes, kwargs={"n":4})

    # 启动多线程
    t1.start()
    t2.start()

    print("main threading done ....")
cook rice ...0
cook dishes...0
main threading done ....
cook dishes...1
cook rice ...1
cook dishes...2
cook dishes...3
cook rice ...2

メインスレッドを守ります

しかし、また、プロパティ、設定する、あるコードの観点から同じピースのプロセスとデーモン=真をします。

import time
import threading


def cook_rice(n):
    for i in range(n):
        print(f"cook rice ...{i}")
        time.sleep(1)


if __name__ == '__main__':

    # 将 daemon 参数 传为 True 即设置为了守护主线程.
    t1 = threading.Thread(target=cook_rice, args=(4,), daemon=True)

    # 启动多线程
    t1.start()
    time.sleep(2)
    print("main threading done ....")
cook rice ...0
cook rice ...1
cook rice ...2
main threading done ....

私のテストでは、ディスカバリスレッドとプロセスのこの部分は、複数のスレッドでは、異なる点が主要プロセスの終了は、スレッドの残りの部分は実行を継続しますデーモンに一つだけのスレッドであれば、そしてよりもデーモン与えるプロセスは、停止した場合、プロセスは、全体の使命は一時的に、非常に不思議ではない、まだその時点で到着しました。従います、そして私はCECEが見る従ってください。

閉塞 - 子供のための待機を終了

実際には、これは直接、私は単純に精通なりたい主に何を、デーモンはまだラインではなく、設定され実行されていない、不可解な)(参加このAPIはただの友達。

import time
import threading


# 我每天下班之后首先是: 煮饭, 做菜
def cook_rice(n):
    for i in range(n):
        print(f"cook rice ...{i}")
        time.sleep(1)


if __name__ == '__main__':
    # 假设就各创一个线程来弄
    t1 = threading.Thread(target=cook_rice, args=(4,), daemon=True)

    # 启动多线程
    t1.start()
    time.sleep(2)

    # 阻塞等待, 子进程结束
    t1.join()
    print("main threading done ....")
cook rice ...0
cook rice ...1
cook rice ...2
cook rice ...3
main threading done ....

おすすめ

転載: www.cnblogs.com/chenjieyouge/p/12393106.html