Maison > développement back-end > Tutoriel Python > Explication détaillée d'exemples de threads et de coroutines simples en python

Explication détaillée d'exemples de threads et de coroutines simples en python

PHP中文网
Libérer: 2017-06-21 16:49:20
original
1585 Les gens l'ont consulté

La prise en charge des threads en python n'est en effet pas suffisante, mais on dit que python dispose d'un module de framework réseau asynchrone complet. J'espère que vous pourrez l'apprendre à l'avenir. Voici un bref résumé des threads en python

.

bibliothèque de threads Peut être utilisée pour exécuter des objets appelables Python arbitraires dans un thread séparé. Bien que ce module ne prenne pas suffisamment en charge les opérations liées aux threads, nous pouvons toujours utiliser des threads simples pour gérer les opérations d'E/S afin de réduire le temps de réponse du programme.

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()  # 停止线程
Copier après la connexion

La fonction de démarrage is Il est utilisé pour démarrer le thread et la fonction _stop est utilisée pour arrêter le thread. Afin d'éviter des problèmes tels que le blocage lors de l'exécution d'opérations d'E/S dans un thread, après une exécution pendant un certain temps, vous pouvez déterminer si le thread est toujours en vie. Si le thread existe toujours, appelez _stop() pour l'arrêter. empêcher le blocage (vous pouvez encapsuler la fonction _stop dans la classe, je ne l'ai pas fait ici).

Bien sûr, vous pouvez appeler le pool de threads ThreadPool pour le gérer au lieu de créer manuellement des threads. S'il n'est pas nécessaire de partager des variables entre les threads, il est très pratique d'utiliser des threads, ce qui peut réduire de nombreuses opérations gênantes et gagner du temps. Si nous avons besoin de communiquer entre les threads, nous pouvons utiliser des files d'attente pour y parvenir :

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)
Copier après la connexion

 

L'instance de file d'attente sera partagée par tous les threads et elle possède tous verrous requis afin qu’ils puissent être partagés en toute sécurité entre un nombre illimité de threads. Faites attention ici à ne pas utiliser de méthodes de classe de file d'attente autres que les méthodes put() et get() dans les multi-threads, car cela n'est pas fiable dans un environnement multi-thread ! Pour une communication simple et réduite de données dans des threads, des files d'attente peuvent être utilisées. Si les données volumineuses nécessitent une communication interactive, Python fournit des modules associés que vous pouvez utiliser.

La soi-disant coroutine est en fait un programme de rendement dans un environnement monothread.

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()
Copier après la connexion

Ici, je voudrais parler de mon expérience d'utilisation de python pendant cette période, qui est en effet bonne, mais ses performances ont également été critiquées lorsque j'ai commencé à apprendre Python. J'ai également créé des choses intéressantes. Les programmes semblent au moins de haute qualité, comme l'utilisation du traitement du langage naturel de Python pour effectuer une analyse des sentiments et les programmes d'exploration les plus populaires, ainsi que la création de graphiques d'analyse de données éblouissants. Peu à peu, j'ai abandonné ceux-ci, car le programme ne se concentre pas sur ceux-là. Tant que vous connaissez la syntaxe de base et comprenez les documents officiels, vous pouvez le faire. L'objectif du code du programme est la performance et l'optimisation. Dans la mesure du possible, écrire un programme avec les fonctions les plus complètes, les meilleures performances et la plus belle structure. En fait, c'est un peu le « soft power culturel » que disent souvent les professeurs de politique. dans un programme devrait être d'intégrer les modèles de conception les plus appropriés, l'optimisation du programme la plus complète, les structures de données les plus efficaces en termes de performances, etc.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal