Grundlegende Python-Hinweise (1)


Vorwort

      Hinweise zu den Grundlagen von Python. Dieser Artikel umfasst Wissenspunkte wie: Zuordnung, Sammlung, den Unterschied zwischen __new__ und __init__ in Python, Referenzübergabe und Wertübergabe sowie die Einführung und Verwendung von ThreadPoolExecutor in Thread-Pools.


1. Kartierung

     1) Mapping Types ist ein assoziativer Containertyp, der die Mapping-Beziehung zwischen Objekten speichert.
     2) Dictionary (dict) ist der einzige Zuordnungstyp in Python. Es handelt sich um einen assoziativen Container, der Schlüssel-Wert-Paare speichert (Zuordnung von Schlüsseln zu Werten). Unter diesen muss der Schlüssel ein hashbares Python-Objekt sein und der Wert kann ein beliebiges Python-Objekt sein.
     3) Die Schlüssel des Wörterbuchs müssen hashbar sein.

2. Sammlung

     1) Eine Menge ist eine ungeordnete Folge sich nicht wiederholender Elemente.
     2) Sie können geschweifte Klammern { } oder die Funktion set() verwenden, um einen Satz zu erstellen. Hinweis: Um einen leeren Satz zu erstellen, müssen Sie set() anstelle von { } verwenden, da { } zum Erstellen eines leeren Wörterbuchs verwendet wird.
     3) Set in Python bestimmt die Position basierend auf dem Hash-Wert des Elements.

3. Der Unterschied zwischen __new__ und __init__ in Python

     1) Die Methode __init__ ist die Initialisierungsmethode, die nach der Erstellung des Instanzobjekts aufgerufen wird und dann einige Anfangswerte der Objektattribute festlegt.
     2) __new__ wird aufgerufen, bevor die Instanz erstellt wird, da seine Aufgabe darin besteht, eine Instanz zu erstellen und diese dann zurückzugeben. Es handelt sich um eine statische Methode.
     3) Das heißt, __new__ wird vor __init__ aufgerufen. Der Rückgabewert (Instanz) von __new__ wird an den ersten Parameter der __init__-Methode übergeben, und dann legt __init__ einige Parameter für diese Instanz fest.

4. Übergabe als Referenz und Übergabe als Wert

     1) Die Python-Parameterübergabe verwendet einheitlich die Referenzübergabe. Weil Python-Objekte in veränderliche Objekte (Liste, Diktat, Menge usw.) und unveränderliche Objekte (Zahl, Zeichenfolge, Tupel usw.) unterteilt sind.
     2) Veränderliche Objekte werden als Referenz übergeben. Der Wert eines veränderlichen Objekts kann geändert werden, sodass das ursprüngliche Objekt durch Ändern des Parameterwerts geändert werden kann. Ähnlich wie die Referenzübergabe in der C-Sprache.
     3) Unveränderliche Objekte werden als Wert übergeben. Sowohl die Parametervariable als auch die Originalvariable verweisen auf dieselbe Speicheradresse, das unveränderliche Objekt kann jedoch nicht geändert werden, sodass die Neuzuweisung des Parameters keine Auswirkungen auf das Originalobjekt hat, ähnlich wie bei der Wertübertragung in der C-Sprache.

5. ThreadPoolExecutor des Thread-Pools

     1) Ab Python 3.2 stellt uns die Standardbibliothek das Modul concurrent.futures zur Verfügung. Dieses Modul stellt die Klasse ThreadPoolExecutor bereit. Die Funktionen dieser Klasse sind wie folgt:

  • Threads können automatisch geplant werden.
  • Der Hauptthread kann den Status eines bestimmten Threads (oder einer bestimmten Aufgabe) und den Rückgabewert abrufen.
  • Wenn ein Thread abgeschlossen ist, weiß der Hauptthread sofort Bescheid.
  • Machen Sie die Codierungsschnittstelle für Multithreading und Multiprozess konsistent.

     2) ThreadPoolExecutor bietet vier Konstruktionsmethoden:
Fügen Sie hier eine Bildbeschreibung ein
     3) Entspricht der viertumfangreichsten Parametererklärung in der obigen Abbildung:

Name Typ Bedeutung
corePoolSize int Größe des Kern-Thread-Pools
maximalePoolSize int Maximale Thread-Poolgröße
keepAliveTime lang Maximale Leerlaufzeit des Threads
Einheit Zeiteinheit Zeiteinheit
Arbeitswarteschlange BlockingQueue< Runnable > Thread-Warteschlange
ThreadFactory ThreadFactory Thread-Erstellungsfabrik
Handler RejectedExecutionHandler Richtlinie verweigern

     4) Verwenden Sie ThreadPoolExecutor, um das Thread-Pool-Objekt zu instanziieren. Übergeben Sie den Parameter max_workers, um die maximale Anzahl von Threads festzulegen, die gleichzeitig im Thread-Pool ausgeführt werden können.
     5) Die Submit-Funktion sendet die Aufgabe (Funktionsname und Parameter), die der Thread ausführen muss, an den Thread-Pool und gibt das Handle der Aufgabe zurück (ähnlich wie bei Dateien und Zeichnungen). Beachten Sie, dass Submit () nicht blockiert, sondern kehrt sofort zurück. Über das von der Submit-Funktion zurückgegebene Task-Handle kann mit der Methode done() ermittelt werden, ob die Aufgabe abgeschlossen ist.
     6) Die Rolle der as_completed()-Methode. Obwohl die obige Methode eine Möglichkeit bietet, festzustellen, ob eine Aufgabe abgeschlossen ist, kann sie nicht immer im Hauptthread ermittelt werden. Manchmal erhalten wir das Ergebnis, wenn wir wissen, dass eine Aufgabe abgeschlossen ist anstatt jedes Mal ständig zu urteilen. Ist die Aufgabe beendet? Zu diesem Zeitpunkt können Sie die Methode as_completed() verwenden, um die Ergebnisse aller Aufgaben gleichzeitig abzurufen.
     7) Die Methode as_completed() ist ein Generator, der blockiert, wenn keine Aufgabe abgeschlossen ist, es sei denn, es ist ein Timeout festgelegt. Wenn eine bestimmte Aufgabe abgeschlossen ist, gibt die Aufgabe nach (gibt die Ausführungsrechte der aktuellen Aufgabe auf), und die Anweisung unter der for-Schleife kann ausgeführt werden und dann weiterhin blockiert werden, bis alle Aufgaben abgeschlossen sind. Aus den Ergebnissen ist auch ersichtlich, dass die zuerst abgeschlossene Aufgabe zuerst dem Hauptthread mitgeteilt wird.
     8) Regelmäßige Verwendung von Thread-Pool-Fällen.

#!/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))

Fügen Sie hier eine Bildbeschreibung ein
     9) Verwenden Sie die with-Anweisung, um eine Instanz über ThreadPoolExecutor zu erstellen.

#线程组件
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来获取返回值

Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/qq_44029310/article/details/126435308
Empfohlen
Rangfolge