Heim  >  Artikel  >  Backend-Entwicklung  >  Zusammenfassung von Threads und Coroutinen in Python

Zusammenfassung von Threads und Coroutinen in Python

零下一度
零下一度Original
2017-06-16 10:29:111065Durchsuche

Der folgende Editor bietet Ihnen eine Lernerfahrung (Teilen) über einfache Threads und Coroutinen in Python. Der Herausgeber findet es ziemlich gut, deshalb werde ich es jetzt mit Ihnen teilen und es allen als Referenz geben. Folgen wir dem Editor und werfen wir einen Blick darauf.

Die Unterstützung für Threads in Python reicht zwar nicht aus, aber es heißt, dass Python über ein vollständiges asynchrones Netzwerk-Framework-Modul verfügt. Ich hoffe, in Zukunft mehr darüber zu erfahren. Hier ist eine einfache Einführung in Threads in Python. Zusammenfassend:

Die Threading-Bibliothek kann verwendet werden, um beliebige aufrufbare Python-Objekte in einem separaten Thread auszuführen. Obwohl dieses Modul nicht genügend Unterstützung für Thread-bezogene Vorgänge bietet, können wir dennoch einfache Threads zur Verarbeitung von E/A-Vorgängen verwenden, um die Antwortzeit des Programms zu verkürzen.

from threading import Thread
import time
 
 
def countdown(n):
  while n > 0:
    print('T-minus:', n)
    n -= 1
 
 
t = Thread(target=countdown, args=(10,))
t.start() # 开启线程
 
time.sleep(2)
 
if t.is_alive() is True:
  print("停止线程...")
  t._stop() # 停止线程

Die Startfunktion wird zum Starten des Threads und die _stop-Funktion zum Stoppen des Threads verwendet. Um Probleme wie Blockierungen beim Ausführen von E/A-Vorgängen in einem Thread zu verhindern, können Sie nach einer gewissen Zeit feststellen, ob der Thread noch aktiv ist. Wenn der Thread noch vorhanden ist, rufen Sie _stop () auf, um ihn zu stoppen Blockierung verhindern (Sie können die _stop-Funktion in die Klasse kapseln, das habe ich hier nicht gemacht).

Natürlich können Sie den ThreadPool-Thread-Pool aufrufen, um ihn zu verarbeiten, anstatt Threads manuell zu erstellen. Wenn keine Notwendigkeit besteht, Variablen zwischen Threads gemeinsam zu nutzen, ist die Verwendung von Threads sehr praktisch, wodurch viele mühsame Vorgänge reduziert und Zeit gespart werden können. Wenn wir zwischen Threads kommunizieren müssen, können wir Warteschlangen verwenden, um dies zu erreichen:

from queue import Queue
from threading import Thread
 
 
class kill:
  def terminate(self, t):
    if t.isAlive is True:
      t._stop()
 
 
def product(out_q):
  for i in range(5):
      out_q.put(i)
 
 
def consumer(in_q):
  for i in range(5):
    print(in_q.get())
 
 
q = Queue()
t1 = Thread(target=consumer, args=(q,))
t2 = Thread(target=product, args=(q,))
t1.start()
t2.start()
 
 
k = kill() # 查询线程是否终止,防止阻塞...
k.terminate(t1)
k.terminate(t2)

Die Warteschlangeninstanz wird von allen Threads gemeinsam genutzt und besitzt alle erforderlichen Sperren, sodass sie Sicher sein können zur gemeinsamen Nutzung in beliebig vielen Threads. Seien Sie hier vorsichtig und verwenden Sie in Multithreads keine anderen Methoden der Warteschlangenklasse als die Methoden put () und get (), da dies in einer Multithread-Umgebung unzuverlässig ist! Für die einfache und kleine Kommunikation von Daten in Threads können Warteschlangen verwendet werden. Wenn große Datenmengen interaktive Kommunikation erfordern, bietet Python entsprechende Module, die Sie speziell für Baidu verwenden können.

Die sogenannte Coroutine ist eigentlich ein Ertragsprogramm in einer Single-Threaded-Umgebung.


from collections import deque
 
 
def countdown(n):
  while n > 0:
    print("T-minus", n)
    yield # 返回之后下次直接从这里执行...相当于C#里面得yield return .
    n -= 1
  print("this is countdown!!!")
 
 
def countup(n):
  x = 0
  while x < n:
    print("Counting up", x)
    yield
    x += 1
 
 
class TaskScheduler:
  def init(self):
    self._task_queue = deque()
 
  def new_task(self, task):
    self._task_queue.append(task)
 
  def run(self):
    while self._task_queue:
      task = self._task_queue.popleft()
      try:
        next(task)
        self._task_queue.append(task)
      except StopIteration:
        pass
 
 
sche = TaskScheduler()
sche.new_task(countdown(10))
sche.new_task(countdown(5))
sche.new_task(countup(15))
sche.run()

Hier möchte ich über meine Erfahrungen mit Python in dieser Zeit sprechen, aber seine Leistung wurde auch kritisiert, als ich anfing Beim Erlernen von Python habe ich es auch geschafft, zumindest die Qualität einiger der umwerfenderen Programme zu verbessern, z. B. die Verwendung der natürlichen Sprachverarbeitung von Python zur Durchführung von Stimmungsanalysen und der angesagtesten Crawler-Programme sowie die Erstellung umwerfender Datenanalysediagramme. Nach und nach lasse ich diese los, denn der Fokus des Programms liegt nicht darauf. Solange Sie die grundlegende Syntax kennen und die offiziellen Dokumente verstehen, können Sie den Fokus des Programmcodes auf Leistung und Optimierung legen. Schreiben Sie so weit wie möglich ein Programm mit den vollständigsten Funktionen, der besten Leistung und der schönsten Struktur. Tatsächlich ist dies ein bisschen wie die „kulturelle Soft Power“, die politische Lehrer oft nennen. In einem Programm sollte es darum gehen, die am besten geeigneten Entwurfsmuster einzubetten, die umfassendste Programmoptimierung durchzuführen, die leistungssparendsten Datenstrukturen zu übernehmen usw.

Das obige ist der detaillierte Inhalt vonZusammenfassung von Threads und Coroutinen in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn