Pythonの研究ノート--Day06

Pythonの研究ノート--Day06

今日行うには長い六日、燃料油、プロセスとスレッドの経過後

プロセス&スレッド

プロセス(プロセス)は、システムの活動に関するデータの集合で実行するコンピュータプログラムは、リソース割り当ておよびスケジューリングの基本単位である基礎となるオペレーティング・システム・アーキテクチャです。いったんプロセスは、動作時分割オペレーティングシステムの基本的な単位です。コンピュータアーキテクチャで設計プロセスの初期段階志向(例えば初期のUNIX、Linux2.4およびそれ以前のような)で、基本的なプロセスは、実行主体のプログラムであり、コンピュータ・アーキテクチャデザインで現代のスレッドで(最も近代的なオペレーティング・システム、Linux2ため。 6およびそれ以降のバージョン)、プロセス自体は、ユニットの基本的な動作が、容器のスレッドではありません。このプログラムは、命令、データとプロセスのその説明は、実際にプログラムのインスタンスを実行しているの組織です。そこに同じ番組のカテゴリーに関連したいくつかのプロセスであってもよく、各プロセスは、独立して、同期または非同期モードの両方であることができます。現代のコンピュータシステムは、メモリにロードされた処理プログラムの複数の形で同時にすることができます。
スレッド(英語:スレッド)が操作スケジューリングが可能なオペレーティングシステムの最小単位です。これは、プロセスの単位プロセスの実際の動作が含まれます。スレッドは、プロセスシーケンスの単一の制御フローを参照して、プロセスは、並行して、各スレッドは、異なるタスクを実行するために、複数のスレッドによって複雑にすることができます。ユーザスレッド(ユーザスレッド)はスレッドと呼ばれながら、SunOSのUnixのシステムVに、また軽量プロセス(軽量プロセス)と呼ばれているが、より軽量プロセスは、カーネルスレッド(カーネルスレッド)を指します。

コンセプトは、提案されました

プロセスは、最初のMIT MULTICSシステムとIBMのCTSS / 360システムによって1960年代初頭に導入されます。

プロセスの特徴

  • ダイナミクス:プロセスの本質は、オペレーティングシステム内のプログラムのマルチチャネル実行され、プロセスは動的に生成され、動的消光。
  • 並行性:任意のプロセスは、一緒に他のプロセスと同時に実行することができます
  • 独立:独立したユニットプロセスが独立して動作するだけでなく、システムリソースの割り当てとスケジューリングできる基本単位であります
  • 非同期の性質:プロセス間の相互作用に起因するので、処理は、すなわち、間欠的に行う前方に独立した、予測不可能な速度のプロセスに従っていることを
    構造的特徴:プロセス制御プログラムの三つのブロックの一部、データ、およびプロセス

マルチプロセスのPython

単一プロセスの例で見てみましょう

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:单进程举例
from random import randint
from time import sleep, clock


def play_video(videoname):
    print("开始播放%s" % videoname)
    video_time = randint(5, 8)
    sleep(video_time)
    print("%s播放完毕,共%d秒" % (videoname, video_time))


def main():
    start = clock()
    play_video("动作片.avi")
    play_video("龙珠z第271集.mp4")
    end = clock()
    print("共使用%f秒" % (end - start))


if __name__ == '__main__':
    main()

業績

开始播放动作片.avi
动作片.avi播放完毕,共5秒
开始播放龙珠z第271集.mp4
龙珠z第271集.mp4播放完毕,共8秒
共使用13.000016秒

コードは、シリアル方式である、順次実行されていること以上の結果から、私はポイントを使用していた2つの時間の合計ですが、ドラゴンボールZ 271セットを、再生するために再生する最初のアクション映画ということを意味画面には、アクションを再生するには、左、およびパールを再生する権利、今回は別のプロセスに遊びタスクの2に複数のプロセスを使用する必要があります。

マルチプロセスの例

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:多进程举例
from multiprocessing import Process
from random import randint
from time import sleep, clock


def play_video(videoname):
    print("开始播放%s" % videoname)
    video_time = randint(5, 8)
    sleep(video_time)
    print("%s播放完毕,共%d秒" % (videoname, video_time))


def main():
    start = clock()
    p1 = Process(target=play_video, args=('动作片.avi',))
    p2 = Process(target=play_video, args=('龙珠z第271集.mp4',))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    end = clock()
    print("共使用%f秒" % (end - start))


if __name__ == '__main__':
    main()

業績

开始播放动作片.avi
开始播放龙珠z第271集.mp4
动作片.avi播放完毕,共6秒
龙珠z第271集.mp4播放完毕,共7秒
共使用7.192672秒

ルック、多くの時間を節約することができ、はるかに高速の両方の方法で、マルチプロセスを見て、私たちは、Processクラスを通じてプロセスオブジェクトを作成し、プロセスを示すパラメータコードによって渡されたターゲットパラメータを行うことが開始され、引数に続くパラメータの組であります、プロセスを開始し、実行を終了したようなスタート法などの方法により、プロセスに参加します。

Pythonのマルチスレッド

例えば、単一スレッド

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:单线程举例
import time

def saySorry():
	print('sorry')
	time.sleep(1)

if __name__ == "__main__":
	start = time.clock()
	for i in range(5):
		saySorry()
	end = time.clock() - start
	print("运行时间:%f" % end) 

業績

sorry
sorry
sorry
sorry
sorry
运行时间:5.003281

複数の第二のプリントに一回よりも何もない申し訳ありませんが、わずか5秒の合計を過ごしました。その後、我々は今、threadingモジュールマルチスレッドプログラミングを使用して、モジュールは、より多くのマルチスレッドプログラミングを提供し、達成するために糸モジュールの導入でPythonのこの初期のバージョンでは、マルチスレッドコードを見てみましょう古く、何かが足りません優れたオブジェクト指向のパッケージ。saySorryは、バージョンは以下のマルチスレッド

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:多线程举例
import time
import threading

def saySorry():
	print('sorry')
	time.sleep(1)

if __name__ == "__main__":
	start = time.clock()
	for i in range(5):
		t = threading.Thread(target=saySorry)
		# 线程启动,开始执行线程
		t.start()
	end = time.clock() - start
	print("运行时间:%f" % end) 

業績

sorry
sorry
sorry
sorry
sorry
运行时间:0.006523

明らかにそれ、Threadクラスのモジュールをスレッドのスレッドを作成することによって、プログラムの実行時間の大幅な削減には、Threadクラスから継承することで、スレッドのカスタムクラスを作成し、スレッドオブジェクトを作成することができ、その上にスレッドを開始し、ときstart()メソッド呼び出されたとき、それは実際にスレッドを作成し、実行を開始
メインスレッドは、スレッドの終了が終了するまで、すべての子供たちのために待機します

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:多线程举例
from threading import Thread
import time
from time import clock


class SaySorry(Thread):

    def run(self):
        print('sorry')
        time.sleep(1)


def main():
    start = clock()
    s1 = SaySorry()
    s2 = SaySorry()
    s1.start()
    s2.start()
    s1.join()
    s2.join()
    end = clock()
    print("共使用%f秒" % (end - start))


if __name__ == '__main__':
    main()

マルチスレッドは、マルチスレッド化通信は、グローバル変数を介して達成することができ、プロセスのメモリ空間を共有することができますが、予期しない結果がプログラム障害またはクラッシュにつながることがあります。リソースが競う複数のスレッドを使用することであるならば、我々は通常、そうでない場合は、リソースがで「混沌」の状態にある、保護を追加する必要があり、「重要なリソース」への「重要なリソース」のアクセスを呼び出します。以下は、次の保護されていない、重要なアカウントは無料で、お金を節約の例を引用

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:存钱
from threading import Thread
import time


class Account(object):

    def __init__(self):
        self.balance = 0

    def save(self, money):
        # 计算存款后的结果
        money_temp = self.balance + money
        # 模拟存款操作业务耗时0.001秒
        time.sleep(0.001)
        # 修改账户余额
        self.balance = money_temp


class User(Thread):

    def __init__(self, account, money):
        super().__init__()
        self.account = account
        self.money = money

    def run(self):
        self.account.save(self.money)


def main():
    account = Account()
    threads = []
    # 创建200个人每人向账户中存款1元
    for i in range(200):
        user = User(account, 1)
        threads.append(user)
        user.start()
    # 等待所有存款的线程都执行完毕
    for user in threads:
        user.join()
    print("账户余额共有:%d" % account.balance)


if __name__ == '__main__':
    main()

営業成績は、彼がそう、より多くの、これはあまりにも、ハハがあるため、多くのスレッドがアカウントの1に0から同時にすべての時間を開始しているべきではないことを確認するために驚いた感じることを得るかもしれないことを私は表示されません。誤った結果は、その後、どのように我々はこの現象を回避していますか?ロック操作は、他のロック・スレッドがブロックされませんでしたが、あなたは、唯一それがオブジェクトにアクセスできるアカウントへのスレッドアクセスは、アカウントがロックされるとき、ロックによって私たちのアカウントを保護することができ、されて入ってきましたロックスレッドがロックをかけるまで待って、他のスレッドは、右の結果を得るためにように、私たちは保護の目的を達成するために、アカウントにアクセスするための単一のスレッドを達成できるように、競合ロックへのチャンスがあります。

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:存钱 加锁
from threading import Thread, Lock
import time


class Account(object):

    def __init__(self):
        self.balance = 0
        self._lock = Lock()

    def save(self, money):
        # 先获取锁才能执行后续的代码
        self._lock.acquire()
        try:
            # 计算存款后的结果
            money_temp = self.balance + money
            # 模拟存款操作业务耗时0.001秒
            time.sleep(0.001)
            # 修改账户余额
            self.balance = money_temp
        finally:
            # 在finally中执行释放锁的操作保证正常异常锁都能释放
            self._lock.release()


class User(Thread):

    def __init__(self, account, money):
        super().__init__()
        self.account = account
        self.money = money

    def run(self):
        self.account.save(self.money)


def main():
    account = Account()
    threads = []
    # 创建200个人每人向账户中存款1元
    for i in range(200):
        user = User(account, 1)
        threads.append(user)
        user.start()
    # 等待所有存款的线程都执行完毕
    for user in threads:
        user.join()
    print("账户余额共有:%d" % account.balance)


if __name__ == '__main__':
    main()

一般に、このようなAであります

エピローグ

最後のブログの最初の時間は、それはあまりにも長い間、可能な限り、運動後の毎日の戦いは、毎日更新されます。マルチスレッドとマルチプロセス、ハートハートHEART!拡張がたくさん。良い嵐ああ、睡眠睡眠。
エラーがある場合、私の記事を見つけるか、何かいいアイデアは、私に連絡することができている場合は、私たちが一緒に進行一緒に勉強し、私のメールアドレスは[email protected]です

のは、これらの複数の操作を行いましょう!

公開された26元の記事 ウォンの賞賛2 ビュー2342

おすすめ

転載: blog.csdn.net/qq_42909545/article/details/103171489