Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung von Beispielen für einfache Threads und Coroutinen in Python

Detaillierte Erläuterung von Beispielen für einfache Threads und Coroutinen in Python

PHP中文网
PHP中文网Original
2017-06-21 16:49:201515Durchsuche

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, Sie können es in Zukunft lernen. Hier ist eine kurze Zusammenfassung der Threads in Python

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 Reaktionszeit 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 ist Es wird verwendet, um den Thread zu starten, und die Funktion _stop wird verwendet, um den Thread zu stoppen. 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 dennoch 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 Erforderliche Sperren, damit sie sicher von einer beliebigen Anzahl von Threads gemeinsam genutzt werden können. Achten Sie hier darauf, in Multithreads keine anderen Methoden der Warteschlangenklasse als die Methoden put() und get() zu verwenden, 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 eine 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. Es ist zwar gut, aber seine Leistung wurde auch kritisiert. Ich habe auch einige coole Dinge gemacht, zumindest klingen sie hochwertig, wie zum Beispiel 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, die vollständigste Programmoptimierung, die leistungseffizientesten Datenstrukturen usw. einzubetten.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Beispielen für einfache 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