スリーウェイ(プロセス、スレッド、コルーチン)3つのデバイス(イテレータ、デコレータ、ビルダー)

プロセス

  • リソース割り当てプロセスが最小単位である(メモリ、CPU、ネットワーク、IO)
    • プログラム起動し、実行中のプロセスであり、
      • (私たちのハードディスクに格納されたプログラムコード)プログラムとは何ですか
      • ハードドライブ(256G)、メモリ(8G)
      • 我々はI / O操作によって、実際には、ときに、プログラムを開くには、アイコンをダブルクリックすると(読み書き)メモリ内部
      • メモリは、私たちが意味する資源であります
      • CPUのタイムシェアリング
        • CPUは、はるかに速くあなたが確信しているあなたの手の速度、各スレッドを処理する時間が、あまりにも速くによるものよりも、各スレッドは、排他的CPUであります
        • CPU CPUを取得するために、唯一のタイムスライスを計算し、実際のスレッドの実行
        • あなたはネットワーク、ディスクや他のリソースを使用する場合は、必要のCPUスケジューリング
    • プロセスは、別個のメモリ空間を有しているので、相互に通信する方法はありません
      • 通信する方法のプロセス
        • プロセスキュー(父と息子のプロセス間通信)
        • パイプ(同じプログラムの下に2つのプロセス間通信)
        • マネージャ(同じプログラムに基づく通信の複数のプロセス)
        • RabbitMQの、他の(異なるプログラム間通信)のRedis
    • なぜ我々は、プロセスのプールが必要なのか
      • プロセスの使い捨てオープン指定された数
      • 10プロセスがある場合は、百のタスクがある、どのように多くは、(一回だけ10を扱う)を扱うことができます
      • オープンなプロセスの防止、過剰な数が過度の圧力にサーバーを引き起こし

スレッド

  • プロセスでは、なぜ我々は、スレッドが必要なのか
    • プロセスは一度だけのことを行うことができないので
  • スレッドとは何ですか
    • スレッドは、オペレーティングシステムのスケジューラの最小単位であります
    • スレッドが真のパフォーマーであることプロセスである、いくつかの命令の(プロセス・リソースの所有者)の集まりです
    • 同じプロセスの下でもっと読むスレッド共有メモリ空間、データへの直接アクセス(データ共有)
    • データのセキュリティを確保するために、あなたが使用する必要があり、スレッドロックを
  • GILグローバルインタープリタロック
    • グローバルPythonインタプリタで一つだけのスレッドが同時に実行されていることを保証するために、
    • データを修正するために、複数のスレッドを防ぐために、
  • スレッドロック(ミューテックス)
    • GILロックは1つのみのスレッドがリソース上で動作し、同じ時間を保証することができますが、1つのスレッドでGIL時間を解放するかもしれないが、まだ完了していない、他のスレッドは、最大動作可能
    • データ・スレッド・ロック・スレッドの性質は、ミューテックスを追加しました
      • mysqlの共有mutexロック&
        • 書き込み共有ロック、すべてのスレッドが読み取ることができますが、ありません:mysqlのは、ロックを共有しました
        • 排他ロックをのmysql:排他的、でないデータを読み込み、任意のスレッドに記載の
      • プラス他のすべてのスレッドのスレッドロックした後、このデータを読み取ることができません読んで
    • なぜGILグローバルインタプリタロックが必要スレッドロックを持っています
      • CPUは、時分割で使用されているので
  • デッドロックが定義されています
    • リソースの競合を引き起こした別の現象を待っていると、実装工程における二つ以上のプロセスまたはスレッド、外部からの力の欠如は、彼らが推進して続けることができなくなります

コルーチン

  • コルーチンとは何ですか

    • コルーチンマイクロスレッド、ズタズタ、基本的にスレッド化
    • コルーチン単一のスレッドが高い並行性を扱うことができます
      • スレッドの出会いは、I / O操作は障害物をお待ちしております、コルーチン出会いI / Oは、自動的に(CPUのみの操作を残す)スイッチ
      • スレッドの状態は、CPUレジスタとスタックに格納し、協会のプロセスは、非常に速く、独自のスペースなので、ノーコンテキストスイッチのオーバーヘッドを持っています
    • なぜコルーチンI / O自動切り替えに遭遇することができます
      • Aコルーチンgeventモジュール(モジュール封入greenlet)I / O自動切替に遭遇
  • コルーチンの欠点

    • マルチコアリソースを利用することができません:コルーチンの性質は、シングルスレッドで、それは、単一のマルチコアCPUの過ごすことができない、コルーチンとプロセスが複数のCPU上で実行するために協力する必要があります
    • プログラム全体をブロックする(例えばIOが場合など)スレッドがブロック(遮断)動作
  • 最大の利点のコルーチン

    • のみならず、高い並行性(高い並行性下シングルスレッドプロセス)の治療であります
    • 特に、省資源(500日活、PHPの必要性で書かれた複数の2ステートマシンが、あまりにもgolang必要性だけで20機以上)
      • 200台の以上のマシン年
      • 機械20日年

選択し、epool、プール

  • 実際のI / Oは何ですか?

    • I / Oデータのエッセンスは、ハードディスクである、またはユーザーモードカーネルモードプロセスにコピーから受信したデータを実現します
    • この記事では、バックグラウンドネットワークIO Linux環境について説明します。
    • 例えば、マイクロチャネル、ローカルハードディスク読み出し処理のための
      • マイクロチャネルプロセスは「----オペレーティングシステムディスクの読み出し要求を送信します
      • 唯一のカーネルは、ハードディスク内のデータを読み取ることができるようにする - 「マイクロチャンネルのデータがプログラムに返される(マイクロチャネル直読のように見えます)
  • ユーザモードカーネルモード&

    • システム空間は二つの部分に分割され、カーネル・モード部分は、ユーザーの状態の一部であります
    • カーネルモード:アクセスへの唯一のオペレーティングシステムカーネル空間のリソースの状態
    • ユーザーモード:通常空間の我々の書き込みプログラムを使用して
    • ここに画像を挿入説明
  • 選択する

    • 唯一のハンドル1024が接続されていることができる(接続のためのそれぞれの要求と理解されます)
    • あなたは、アクティブな接続でユーザプログラムを、言うことができません
  • プール

    • ただ、最大1024のアクティブ制限をキャンセル
    • あなたは、アクティブな接続でユーザプログラムを、言うことができません
  • epool

    • 1024だけでなく、最大接続制限を解除します
    • そして、ユーザーがアクティブになっているプログラムを伝えることができます

デコレーター

デコレータは何ですか?(何)

  • 基本的にデコレータの新機能を追加するための他の機能への機能
  • 特長:ソースコードを変更することなく、道の呼び出しを変更しないでください

シナリオデコレータ?(どこで)

  • ユーザ認証は、ユーザログインかどうかを判断します
  • (プロジェクトに非常に少ないと、機能と考えられる)時間の関数の計算
  • ログに挿入されたとき
  • Redisのキャッシュ

なぜデコレータを使うのか?(なぜ)

  • これは、複合アプリケーションのシナリオを要求しました
  • 例えば、メモリ空間の保存、コードの再利用性を向上させるために

どのようにデコレータを使用するには?(どのように)

  • デコレータは、時間の関数を求めて
import time
def timer(func):   #timer(test1)  func=test1
    def deco(*args,**kwargs):
        start_time = time.time()
        func(*args,**kwargs)      #run test1
        stop_time = time.time()
        print("running time is %s"%(stop_time-start_time))
    return deco

# @timer     # test1=timer(test1)
def test1():
    time.sleep(3)
    print("in the test1")
test1()
  • 三デコレータ
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import time
def auth(auth_type):
    print("auth func:",auth_type)
    def outer_wrapper(func):
        def wrapper(*args, **kwargs):
            print("wrapper func args:", *args, **kwargs)
            print('运行前')
            func(*args, **kwargs)
            print('运行后')
        return wrapper
    return outer_wrapper

@auth(auth_type="local") # home = wrapper()
def home():
    print("welcome to home  page")
    return "from home"
home()

ジェネレータ

発電機は何ですか?(何)

  • Builderは、特別なイテレータです
  • yieldキーワードの機能が発電機であるがあります
    • * Builderは、関数本体の最後のリターンの位置を覚えている機能です。
    • 関数呼び出しの真ん中と、すべてのローカル変数の最後の遺跡定数と第二の(またはn番目の)ジェネレータ関数呼び出しのジャンプ。

どのシナリオジェネレータアプリケーション?(どこで)

  • Builderは、我々は通常、書き込みコードを使用することをコンセプトはあまりないかもしれませんが、ソースコードのpythonの広範な使用

  • 私たちの例では、発電機フレーム竜巻+コルーチンに基づいています

  • この例のコード使用で

  • 例えば、我々は、発電機は、多くのスペースを無駄のリストで、スペースを節約するためであれば、百万データを生成したいです

import time
t1 = time.time()
g = (i for i in range(100000000))
t2 = time.time()
lst = [i for i in range(100000000)]
t3 = time.time()
print('生成器时间:',t2 - t1)  # 生成器时间: 0.0
print('列表时间:',t3 - t2)    # 列表时间: 5.821957349777222

なぜビルダー

  • 保存スペース
  • 効率的

使い方

#!/usr/bin/python
# -*- coding: utf-8 -*-
def read_big_file_v(fname):
    block_size = 1024 * 8
    with open(fname,encoding="utf8") as fp:
        while True:
            chunk = fp.read(block_size)
            # 当文件没有更多内容时,read 调用将会返回空字符串 ''
            if not chunk:
                break
            print(chunk)
path = r'C:\aaa\luting\edc-backend\tttt.py'
read_big_file_v(path)

イテレータ

イテレータとは何ですか

  • イテレータは、要素のセットにアクセスする方法であります
    • すべての要素がオーバー訪問されている、とあなたは__next__要素を呼び出すときに呼び出すとStopIterationが異常、復帰につながるまで、最初の要素は常にセット内からアクセス可能です
  • 2つの方法があります:_ ITER _ _ _
    • _ イーター _:反復子自体を返します
    • _ _:次の要素を返します

シナリオ

  • いくつかは、直接イテレータを使用することができます
无线迭代器生产:
	无线迭代器------> from itertools import count(接受俩个参数起点和步长)
    每次调用count都是21递增,将所有的基数打印出来,如果说你的内存足够大的话,可以无限迭代下去(可以使用for循环或者next测试),这里推荐使用next,因为它比较直观。
  • 電話番号(カウント)
    ここに画像を挿入説明
  • サイクル(ギャグ)、次の文字列値は、各コールのうちに作成されます、そして、あなたが最後のものを作成しました、彼は新たな価値を創造するためにリング状停止データ型のように、先頭に戻ります
    ここに画像を挿入説明
  • リミテッドイテレータ

ITER()
インポートislice itertoolsから
islice(反復処理可能、STOP)がパラメータ(イテラブル、終了値)を受け付ける
islice(反復処理可能、スタート、STOP [STEP])は、パラメータを受け付ける(イテレート可能オブジェクト、インデックスがステップを追加してもよいです)

  • ITERベースの反復可能オブジェクトを作成します()
    ここに画像を挿入説明
  • 方法islice使用
    ここに画像を挿入説明
  • カスタムイテレータ(フィボナッチ数)
    ここに画像を挿入説明
公開された84元の記事 ウォンの賞賛1 ビュー2070

おすすめ

転載: blog.csdn.net/lxp_mocheng/article/details/104791361