Pythonの基礎知識(1)


序文

      Python の基本に関するメモ: この記事には、マッピング、コレクション、Python の __new__ と __init__ の違い、参照の受け渡しと値の受け渡し、スレッド プールでの ThreadPoolExecutor の導入と使用などの知識ポイントが含まれています。


1. マッピング

     1) マッピング タイプは、オブジェクト間のマッピング関係を格納する連想コンテナ タイプです。
     2) 辞書 (dict) は、Python の唯一のマッピング タイプであり、キーと値のペア (キーから値へのマッピング) を格納する連想コンテナーです。このうち、キーはハッシュ可能な Python オブジェクトである必要があり、値は任意の Python オブジェクトにすることができます。
     3) 辞書のキーはハッシュ可能である必要があります。

2. 収集

     1) セットは、順序付けられていない、繰り返しのない要素のシーケンスです。
     2) 中括弧 { } または set() 関数を使用してセットを作成できます 注: 空の辞書の作成には { } が使用されるため、空のセットを作成するには、{ } の代わりに set() を使用する必要があります。
     3) Python での Set は要素のハッシュ値に基づいて位置を決定します。

3. Python の __new__ と __init__ の違い

     1) __init__ メソッドは初期化メソッドであり、インスタンス オブジェクトの作成後に呼び出され、オブジェクト属性のいくつかの初期値を設定します。
     2) __new__ は、インスタンスを作成してからそのインスタンスを返すことがタスクであるため、インスタンスが作成される前に呼び出されます。これは静的メソッドです。
     3) つまり、__new__ は __init__ の前に呼び出され、__new__ の戻り値 (インスタンス) は __init__ メソッドの最初のパラメーターに渡され、__init__ はこのインスタンスにいくつかのパラメーターを設定します。

4. 参照渡しと値渡し

     1) Python パラメータの受け渡しでは、一律に参照受け渡しが使用されます。なぜなら、Python オブジェクトは可変オブジェクト (リスト、辞書、セットなど) と不変オブジェクト (数値、文字列、タプルなど) に分かれているからです。
     2) 可変オブジェクトは参照によって渡されます。可変オブジェクトの値は変更できるため、パラメータ値を変更することで元のオブジェクトを変更できます。C言語の参照渡しに似ています。
     3) 不変オブジェクトは値によって渡されます。パラメータ変数と元の変数はどちらも同じメモリ アドレスを指しますが、不変オブジェクトは変更できないため、C 言語での値の転送と同様に、パラメータの再割り当ては元のオブジェクトに影響を与えません。

5. スレッドプールの ThreadPoolExecutor

     1) Python 3.2 以降、標準ライブラリは concurrent.futures モジュールを提供します。このモジュールは ThreadPoolExecutor クラスを提供します。このクラスの機能は次のとおりです。

  • スレッドは自動的にスケジュールできます。
  • メインスレッドは、特定のスレッド(またはタスク)のステータスと戻り値を取得できます。
  • スレッドが完了すると、メインスレッドはすぐにそれを認識します。
  • マルチスレッド、マルチプロセスのコーディングインターフェースを統一します。

     2) ThreadPoolExecutor は 4 つの構築メソッドを提供します。
ここに画像の説明を挿入します
     3) 上図の 4 番目の最も包括的なパラメーターの説明に対応します。

名前 タイプ 意味
コアプールサイズ 整数 コアスレッドプールのサイズ
最大プールサイズ 整数 最大スレッドプールサイズ
キープアライブ時間 長さ スレッドの最大アイドル時間
ユニット 時間単位 時間単位
ワークキュー BlockingQueue< 実行可能 > スレッド待機キュー
スレッドファクトリー スレッドファクトリー スレッド作成ファクトリー
ハンドラ 拒否された実行ハンドラ 拒否ポリシー

     4) ThreadPoolExecutor を使用して、スレッド プール オブジェクトをインスタンス化します。max_workers パラメータを渡して、スレッド プール内で同時に実行できるスレッドの最大数を設定します。
     5) submit 関数は、スレッドが実行する必要があるタスク (関数名とパラメーター) をスレッド プールに送信し、タスクのハンドル (ファイルや描画と同様) を返します。すぐに戻ります。submit 関数によって返されたタスク ハンドルを通じて、done() メソッドを使用してタスクが完了したかどうかを判断できます。
     6) as_completed() メソッドの役割 上記のメソッドはタスクが完了したかどうかを判断する方法を提供しますが、メイン スレッドで常に判断できるわけではありません。タスクが完了したことがわかっている場合には、結果が得られることがあります。毎回常に判断するのではなく、タスクは終了しましたか? 現時点では、as_completed() メソッドを使用して、すべてのタスクの結果を一度に取得できます。
     7) as_completed() メソッドは、タイムアウトが設定されていない限り、タスクが完了しない場合にブロックするジェネレーターです。特定のタスクが完了すると、タスクは降伏 (現在のタスクの実行権限を放棄) し、for ループの下のステートメントを実行できるようになり、すべてのタスクが完了するまでブロックされ続けます。この結果から、最初に完了したタスクが最初にメインスレッドに通知されることもわかります。
     8) スレッド プール ケースの定期的な使用。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

#线程组件
from concurrent.futures import ThreadPoolExecutor,as_completed
import time

def pingScan(self):
    time.sleep(self)
    print("heiheihei".format(self))
    return self

executor = ThreadPoolExecutor(max_workers=2)
urls = [1,2,3]
all_task = [executor.submit(pingScan, (url)) for url in urls]
for future in as_completed(all_task):
    data = future.result()
    print('the result is {}'.format(data))

ここに画像の説明を挿入します
     9) with ステートメントを使用して、ThreadPoolExecutor を通じてインスタンスを構築します。

#线程组件
from concurrent.futures import ThreadPoolExecutor,as_completed
import time

def pingScan(self):
    time.sleep(self)
    print("heiheihei".format(self))
    return self

with ThreadPoolExecutor(max_workers=5) as executor:  # 创建一个最大容纳数量为5的线程池
    task1 = executor.submit(pingScan, 1)
    task2 = executor.submit(pingScan, 2)  # 通过submit提交执行的函数到线程池中
    task3 = executor.submit(pingScan, 3)

    print(f"task1: {
      
      task1.done()}")  # 通过done来判断线程是否完成
    print(f"task2: {
      
      task2.done()}")
    print(f"task3: {
      
      task3.done()}")

    time.sleep(2)
    print(f"task1: {
      
      task1.done()}")
    print(f"task2: {
      
      task2.done()}")
    print(f"task3: {
      
      task3.done()}")
    print(task1.result())  # 通过result来获取返回值

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/qq_44029310/article/details/126435308