Maison  >  Article  >  développement back-end  >  Comment appliquer des coroutines dans la programmation simultanée Python

Comment appliquer des coroutines dans la programmation simultanée Python

王林
王林avant
2023-05-13 08:16:051299parcourir

Qu'est-ce qu'une coroutine ?

La coroutine est une méthode de concurrence plus légère que les threads. Elle ne nécessite pas la surcharge de changement de contexte de thread et peut atteindre la concurrence dans un seul thread. Les coroutines ont généralement les caractéristiques suivantes :

  • Le code dans la coroutine peut suspendre l'exécution et reprendre l'exécution en cas de besoin.

  • Plusieurs coroutines peuvent être exécutées simultanément dans le même thread, mais une seule coroutine est en cours d'exécution à la fois.

  • Les coroutines sont généralement implémentées en fonction de la boucle d'événements (Event Loop), et la boucle d'événements est responsable de la planification de l'exécution de la coroutine.

Coroutines et threads

Les threads et les coroutines sont deux moyens d'implémenter la programmation simultanée, mais ils ont des caractéristiques et des scénarios d'application différents.

**Le thread est l'unité de base de la planification du système d'exploitation. **Chaque thread a son propre contexte d'exécution, y compris la pile de threads, les registres, etc. La commutation entre les threads nécessite un changement de contexte, y compris des opérations telles que la sauvegarde du contexte du thread actuel et la restauration du contexte d'un autre thread. Ces opérations consomment beaucoup de temps et de ressources. En programmation multi-thread, le changement de thread est une opération très courante pour les raisons suivantes :

  1. Planification. Lorsque plusieurs threads sont exécutés en même temps, le système d'exploitation doit planifier ces threads et déterminer quel thread doit être exécuté actuellement en fonction de facteurs tels que la priorité. Le changement de thread est l'une des opérations de base de la planification. En changeant de thread, le système d'exploitation peut réaliser l'exécution simultanée de plusieurs threads.

  2. En attendant. Lorsqu'un thread doit attendre qu'un événement se produise, comme attendre la fin d'une opération d'E/S, attendre qu'un verrou soit libéré, etc., le thread peut libérer activement le processeur pour donner à d'autres threads une chance de s'exécuter. Une fois l'attente terminée, le thread peut être réveillé et l'exécution continue.

  3. Concurrence. Les threads peuvent obtenir l'effet d'une exécution simultanée.Par exemple, un thread gère les requêtes réseau et un autre thread gère l'interaction de l'utilisateur, ce qui peut améliorer la vitesse de réponse et les capacités de traitement du système.

  4. Passer à d'autres threads pour l'exécution. Dans certains cas, le thread peut ne pas être en mesure de poursuivre l'exécution pour certaines raisons, telles que le thread entrant dans une boucle infinie ou une exception se produisant. À ce stade, il est nécessaire de passer à d'autres threads pour l'exécution afin d'éviter les pannes du système ou. d'autres problèmes.

La programmation simultanée de threads est généralement limitée par des problèmes tels que la concurrence multi-thread, les blocages et le changement de contexte. En Python, lorsque vous utilisez une programmation multithread, vous devez faire attention à des problèmes tels que la sécurité des threads et GIL.

Les coroutines sont une méthode de concurrence légère qui est implémentée dans l'espace utilisateur et ne repose pas sur la planification du système d'exploitation. Les coroutines peuvent atteindre la concurrence dans le même thread sans changement de contexte, l'efficacité d'exécution est donc très élevée. Les coroutines utilisent généralement une boucle d'événements (Event Loop) pour planifier l'exécution des coroutines. Lorsque la coroutine doit attendre des opérations d'E/S ou d'autres coroutines, la boucle d'événements suspend l'exécution de la coroutine actuelle et exécute d'autres coroutines, obtenant ainsi une exécution simultanée. Effet. En Python, les coroutines sont généralement implémentées à l'aide du module asyncio, qui prend en charge les E/S asynchrones, la programmation réseau, la planification des tâches et d'autres scénarios. asyncio 模块来实现,支持异步 IO、网络编程、任务调度等场景。

相对于线程,协程的主要优点包括:

  • 更加轻量级,占用的资源更少;

  • 不需要进行上下文切换,执行效率更高;

  • 可以使用事件循环进行调度,实现高并发的效果;

  • 不会受到 GIL 的限制,可以更好地利用多核 CPU。

然而,协程也有一些限制,例如无法利用多核 CPU、调试困难等问题。在选择使用线程还是协程时,需要根据具体的应用场景进行选择。

协程的应用

协程可以应用于很多场景,例如:

  • 网络编程:协程可以帮助我们实现高并发的网络应用。

  • 异步IO:协程可以帮助我们高效地处理异步IO操作。

  • 数据库操作:协程可以帮助我们实现高并发的数据库应用。

  • 任务调度:协程可以帮助我们实现高效的任务调度系统。

演示Demo

下面是一个示例代码,演示了如何使用协程和 asyncio 模块来实现一个简单的任务调度:

import asyncio

async def task1():
    print("Task 1")
    await asyncio.sleep(1)
    print("Task 1 done")

async def task2():
    print("Task 2")
    await asyncio.sleep(2)
    print("Task 2 done")


async def task3():
    print("Task 3")
    await asyncio.sleep(3)
    print("Task 3 done")


async def main():
    await asyncio.gather(task1(), task2(), task3())

这段代码使用了 Python 的协程和 asyncio 模块,定义了三个协程函数 task1task2task3,以及一个主协程函数 main。每个协程函数打印自己的任务名,然后暂停一段时间。主协程函数使用 asyncio.gather

Par rapport aux threads, les principaux avantages des coroutines sont les suivants : 🎜🎜🎜🎜Plus léger et occupant moins de ressources 🎜🎜🎜🎜Pas besoin de changement de contexte et une efficacité d'exécution plus élevée 🎜🎜🎜🎜Les événements peuvent être utilisés pour obtenir une planification en boucle ; les effets de simultanéité élevée 🎜🎜🎜🎜 ne seront pas limités par GIL et pourront mieux utiliser les processeurs multicœurs. 🎜🎜🎜🎜Cependant, les coroutines ont également certaines limitations, telles que l'incapacité d'utiliser des processeurs multicœurs, des difficultés de débogage et d'autres problèmes. Lorsque vous choisissez d'utiliser des threads ou des coroutines, vous devez faire un choix en fonction du scénario d'application spécifique. 🎜🎜Applications des coroutines🎜🎜Les coroutines peuvent être appliquées à de nombreux scénarios, tels que : 🎜🎜🎜🎜Programmation réseau : les coroutines peuvent nous aider à mettre en œuvre des applications réseau à haute concurrence. 🎜🎜🎜🎜E/S asynchrones : les coroutines peuvent nous aider à gérer efficacement les opérations d'E/S asynchrones. 🎜🎜🎜🎜Opérations de base de données : les coroutines peuvent nous aider à mettre en œuvre des applications de bases de données à haute concurrence. 🎜🎜🎜🎜Planification des tâches : les coroutines peuvent nous aider à mettre en œuvre un système de planification des tâches efficace. 🎜🎜🎜🎜Démo🎜🎜Ce qui suit est un exemple de code qui montre comment utiliser les coroutines et le module asyncio pour implémenter un planning de tâches simple : 🎜
Task 1
Task 2
Task 3
Task 1 done
Task 2 done
Task 3 done
[Finished in 3.2s]
🎜Ce code utilise les coroutines de Python et le module asyncio, qui définit trois fonctions coroutine task1, task2, task3 et une fonction coroutine principale main code>. Chaque fonction coroutine imprime son nom de tâche, puis s'arrête pendant un certain temps. La fonction coroutine principale utilise <code>asyncio.gather pour exécuter trois fonctions coroutine simultanément, et le résultat final est : 🎜rrreee

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer