Comparaison des coproductions Python et JavaScript

J519lee 2021-09-15 10:55:32
comparaison des coproductions python et


  • Avec cpu Polynucléation,Pour des raisons historiques(Environnement monothreadé)Fonctions simultanées sous

  • Code simplifié,Évitez de rappeler l'enfer,Prise en charge des mots clés

  • Utilisation efficace des ressources et du matériel du système d'exploitation:Les co - threads comparent les Threads,Moins de ressources utilisées,Le contexte est plus rapide

Qu'est - ce que le co - processus?

Conclusion,Une coproduction est une fonction qui remplit les conditions suivantes:

  • L'exécution peut être suspendue(L'expression en pause est appelée point de pause)

  • Peut être restauré à partir du point de départ suspendu(Conserver ses paramètres originaux et ses variables locales)

  • La boucle d'événements est la pierre angulaire de la programmation asynchrone

Une histoire chaotique

Python L'évolution du processus de co

  • Python2.2 Moyenne,Le générateur a été introduit pour la première fois

  • Python2.5 Moyenne,yield Les mots clés sont ajoutés à la syntaxe

  • Python3.4 Il est temps. yield from(yield from Approximativement égal à yield + Gestion des exceptions + send), Et l'introduction expérimentale de l'asynchrone I/O Cadre asyncio(PEP 3156)

  • Python3.5 Nouveau dans async/await Syntaxe(PEP 492)

  • Python3.6 Moyenne asyncio Bibliothèque"Redressez - vous." (Les documents officiels sont beaucoup plus clairs après)

Au fur et à mesure que la ligne principale se développe,Il existe également de nombreuses implémentations de co - parcours pour les embranchements, comme Gevent.

def foo():
    print("foo start")
    a = yield 1
    print("foo a", a)
    yield 2
    yield 3
    print("foo end")
gen = foo()
# print(gen.next())
# gen.send("a")
# print(gen.next())
# print(foo().next())
# print(foo().next())
# Inpython3.xDans la version,python2.xDeg.next() La fonction a été renommée g.__next__(),Utilisernext(g) Le même effet peut être obtenu .
# next()Suivez - moi.send()Les différents endroits sont,next()Seulement avecNonePasser comme paramètre,Etsend()Peut passeryieldValeur de.
print(next(gen))
print(gen.send("a"))
print(next(gen))
print(next(foo()))
print(next(foo()))
list(foo())
"""
foo start
1
foo a a
2
3
foo start
1
foo start
1
foo start
foo a None
foo end
"""

JavaScript L'évolution du processus de co

  • Code de synchronisation

  • Asynchrone JavaScript: callback hell

  • ES6 Introduction Promise/a+, Générateur Generators(Syntaxe function foo(){}* Une fonction peut être mise en pause /Enregistrer le contexte/ Fonction de restauration de l'état d'exécution ), Nouveaux mots clés yield Pause de la fonction générateur .

  • ES7 Introduction asyncFonctions/awaitSucre grammatical,async Une fonction asynchrone peut être déclarée (Oui. Generator Fonctions et automates,Enveloppé dans une fonction), Cette fonction doit renvoyer un Promise Objet.await Peut attendre Promise Objet resolve, Et obtenir les résultats

Promise La fonction de rappel est également utilisée dans .In then Et catch Une fonction de rappel est passée dans la méthode ,Séparément dans Promise Exécuté lorsqu'il est satisfait et rejeté , Cela lui permet d'être lié pour accomplir une série de tâches .

C'est imbriqué. callback Devenir .then().then()..., Rendre l'écriture et la lecture du Code plus intuitives .

Générateur Generator Le mécanisme de mise en œuvre sous - jacent de Coroutine.

function* foo() {
    console.log("foo start")
    a = yield 1;
    console.log("foo a", a)
    yield 2;
    yield 3;
    console.log("foo end")
}
const gen = foo();
console.log(gen.next().value); // 1
// gen.send("a") // http://www.voidcn.com/article/p-syzbwqht-bvv.html SpiderMonkeySupport moteur send Syntaxe
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3
console.log(foo().next().value); // 1
console.log(foo().next().value); // 1
/*
foo start
1
foo a undefined
2
3
foo start
1
foo start
1
*/

Python Maturation du co - processus

Les objets en attente peuvent être await Utilisé dans l'énoncé, Il existe trois types principaux d'objets en attente :Co - Process(coroutine), Mission(task) Et Future.

Co - Process(coroutine)

  • Fonction de coïncidence : Le formulaire de définition est async def Fonction de;

  • Objet de coopération :Appelez Fonction de coïncidence Objet retourné

  • Ancien modèle basé sur generator(Générateur)Le co - programme de

Mission(Task Objet):

  • Mission Utilisé pour “En parallèle” Programmation , Quand un programme de coopération passe asyncio.create_task() Une fonction égale est encapsulée comme un Mission, L'accord est automatiquement programmé pour l'exécution

  • Task L'objet est utilisé pour exécuter une collaboration dans une boucle d'événements . Si un programme coopératif attend un Future Objet,Task L'objet suspend l'exécution de l'Accord et attend Future Objet terminé.Quand Future Objet Terminé., L'exécution de l'accord emballé reprendra .

  • Calendrier collaboratif de recyclage des événements : Un cycle d'événements à la fois Task Objet.Et un Task L'objet attend un Future Objet terminé, Cette boucle d'événements exécute d'autres Task、 Rappel ou exécution IO Fonctionnement.

  • asyncio.Task De Future Hérite de sa Division Future.set_result() Et Future.set_exception() Tous sauf API.

Objet futur (Future):

  • Future Objet utilisé pour lier Code de rappel sous - jacent Asynchrone de haut niveau / Code d'attente .

  • Après avoir écrit du Code asynchrone sans méthode de rappel , Pour obtenir les résultats d'un appel asynchrone ,Introduire un Future Objet futur .Future Encapsulé avec loop Comportement interactif ,add_done_callback Orientation méthodologique epoll Enregistrer la fonction de rappel,Quand result Lorsque la propriété obtient la valeur de retour , Exécute la fonction de rappel précédemment enregistrée , Vers le Haut coroutine.

Plusieurs cycles d'événements (event loop):

  • libevent/libev:Gevent(greenlet + Période antérieure libevent,Posterior libev) Bibliothèques réseau utilisées , Largement utilisé ;

  • tornado:tornado Le cadre lui - même IOLOOP;

  • picoev:meinheld(greenlet+picoev) Bibliothèques réseau utilisées , Petit et léger ,Par rapport à libevent Amélioration de la structure des données et du modèle de détection des événements , Donc plus vite. .Mais depuis github On dirait qu'il est en panne depuis des années. , Pas grand - chose. .

  • uvloop:Python3 Le nouveau spectacle du temps .Guido Le sabre est fait. asyncio Bibliothèque,asyncio Possibilité de configurer pluggable event loop, Mais il faut API Exigences,uvloop De libuv, Utiliser des structures et des fonctions de bas niveau Python Emballage des objets.Pour l'instant Sanic Le cadre est basé sur cette bibliothèque

Exemple

import asyncio
import time
async def exec():
    await asyncio.sleep(2)
    print('exec')
#  Ce sera synchronisé avec
# async def go():
#     print(time.time())
#     c1 = exec()
#     c2 = exec()
#     print(c1, c2)
#     await c1
#     await c2
#     print(time.time())
# Utilisation correcte
async def go():
    print(time.time())
    await asyncio.gather(exec(),exec()) #  Joignez - vous à l'équipe de coordination pour l'ordonnancement unifié
    print(time.time())
if __name__ == "__main__":
    asyncio.run(go())

JavaScript Maturation du co - processus

Promise Continuer à utiliser

Promise L'essence est une machine d'état , Utilisé pour représenter l'achèvement final d'une opération asynchrone (Ou un échec), Et leurs valeurs résultantes . Il a trois états :

  • pending: État initial,Ce n'est pas un succès,Et ce n'est pas un état d'échec.

  • fulfilled: Cela signifie que l'opération est terminée avec succès.

  • rejected: Cela signifie que l'opération a échoué.

Final Promise Il y aura deux états , Un succès , Un échec ,Quand pending Quand ça change,Promise L'objet appelle différents gestionnaires en fonction de l'état final .

async、awaitSucre grammatical

async、await C'est vrai. Generator Et Promise Emballage combiné , Rendre le Code asynchrone original plus proche du Code synchrone , Et gérer les erreurs /Branche conditionnelle/ Pile d'exception / Le débogage et d'autres opérations sont plus conviviaux .

js Mécanisme de fonctionnement de l'exécution asynchrone

  1. Toutes les tâches sont exécutées sur le fil principal ,Former une pile d'exécution.

  2. En dehors du fil principal , Il y en a un autre. "File d'attente des tâches"(task queue). Tant que la tâche asynchrone a un résultat d'exécution ,Juste là."File d'attente des tâches" Placer un événement dans .

  3. Une fois"Exécution de la pile" Toutes les tâches de synchronisation sont terminées , Le système lit "File d'attente des tâches". Les tâches asynchrones correspondantes , Fin de l'état d'attente , Saisissez la pile d'exécution et commencez l'exécution .

Exécution directe de la tâche de synchronisation rencontrée , Tâche asynchrone rencontrée classée comme macro - tâche (macro-task)Et des micro - missions(micro-task).

Les événements dans toutes les files d'attente de micro - tâches sont traités immédiatement après l'exécution de la pile d'exécution courante , Puis allez dans la file d'attente des tâches macro pour récupérer un événement . Dans le même cycle d'événements , Les micro - tâches sont toujours exécutées avant les macro - tâches .

Exemple

var sleep = function (time) {
    console.log("sleep start")
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve();
        }, time);
    });
};
async function exec() {
    await sleep(2000);
    console.log("sleep end")
}
async function go() {
    console.log(Date.now())
    c1 = exec()
    console.log("-------1")
    c2 = exec()
    console.log(c1, c2)
    await c1;
    console.log("-------2")
    await c2;
    console.log(c1, c2)
    console.log(Date.now())
}
go();

event loop Diviser les tâches :

  • Boucle du fil principal à partir de "File d'attente des tâches"Lire l'événement dans

  • Macro - file d'attente (macro task)js Bloc de code exécuté de façon synchrone ,setTimeout、setInterval、XMLHttprequest、setImmediate、I/O、UI renderingAttendez., L'essence est la tâche de participer au cycle des événements

  • Microfile d'attente (micro task)Promise、process.nextTick(nodeEnvironnement)、Object.observe, MutationObserverAttendez., L'essence est directement Javascript Tâches exécutées dans le moteur qui ne participent pas au cycle des événements

Lire plus Node.js Dans EventLoop (http://www.ruanyifeng.com/blog/2014/10/event-loop.html)

Résumé et comparaison

Description python JavaScript Commentaires
Processus Processus unique Processus unique D'accord.
Interruption/Reprise yield,yield from,next,send yield,next C'est presque pareil.,Mais... JavaScript C'est exact. send Pas besoin.
Objet futur ( Emballage de rappel ) Futures Promise Résolution callback,Même idée.
Générateur generator Generator Oui. yield Package as Co - Process Coroutine,Les idées sont les mêmes
Mots clés après maturation async、await async、await Mots clés , C'est pareil.
Cycle des événements asyncio Le cœur de l'application . Les boucles d'événements exécutent des tâches asynchrones et des callbacks , Réseau exécutif IO Fonctionnement, Et exécuter des sous - processus .asyncio Bibliothèque prise en charge API Plus,Haute contrôlabilité L'environnement basé sur le navigateur est essentiellement une boîte noire , L'extérieur est presque incontrôlable , Classer les tâches par ordre de priorité , La méthode de répartition est différente Il y a une grande différence. ,Environnement opérationnel différent, Les tâches sont programmées différemment ,Python Peut - être avec Node.js Plus grande comparabilité des cycles d'événements , Il faut continuer à apprendre.
版权声明
本文为[J519lee]所创,转载请带上原文链接,感谢
https://pythonmana.com/2021/09/20210915104841281S.html

  1. Realizing the function of sending e-mail automatically with Python
  2. Smtpauthenticationerror in Python: solution
  3. 8 steps to teach you how to solve Sudoku in Python! (including source code)
  4. Python change la vie | identifier facilement des centaines de numéros de livraison
  5. Python change life | utilisation de modèles reconnus par ocr
  6. Bibliothèques Python utiles et intéressantes - - psutil
  7. 3. Traitement des données pandas
  8. 【Python编程基础】控制流之链式比较运算符
  9. MFC uses Python scripting language
  10. 【Python編程基礎】控制流之鏈式比較運算符
  11. 【 base de programmation python】 opérateur de comparaison de chaîne pour le flux de contrôle
  12. Python game development, pyGame module, python implementation of Xiaole games
  13. Mise en œuvre du Code de vérification unique (OTP) avec le cadre de repos Django
  14. Python - eval ()
  15. Python - Programmation orientée objet - _Rapport()
  16. Différence entre python - rep (), Str ()
  17. Python - Programmation orientée objet - _Appel()
  18. Python calling matlab script
  19. Python - Programmation orientée objet - _Nouveau() et mode Singleton
  20. Python - Programmation orientée objet - méthode magique (méthode de double soulignement)
  21. Python - Programmation orientée objet - pratique (6)
  22. Python - Programmation orientée objet - réflexion hasattr, GetAttr, GetAttr, delattr
  23. Python - Programmation orientée objet - _Dict
  24. Python - pydantic (2) Modèle imbriqué
  25. Non-ASCII character ‘\xe5‘ in file kf1.py on line 4, but no encoding declared; see http://python.or
  26. python笔记(一)
  27. Non - ASCII character 'xe5' in file kf1.py on Line 4, but no Encoding declared;Voirhttp://python.or
  28. Notes Python (1)
  29. Talk about how JMeter executes Python scripts concurrently
  30. In Beijing, you can't see the moon in the Mid Autumn Festival. Draw a blood red moon in Python
  31. Un des pandas crée un objet
  32. Machine learning | unitary regression model Python practical case
  33. Draw a "Lollipop chart" with Excel and python
  34. Python uses scikit learn to calculate TF-IDF
  35. Getting started with Python Basics_ 3 conditional statements and iterative loops
  36. Python dynamic properties and features
  37. 云计算开发:Python内置函数-min()函数详解
  38. [Python skill] how to speed up loop operation and numpy array operation
  39. 雲計算開發:Python內置函數-min()函數詳解
  40. Développement de l'informatique en nuage: explication détaillée de la fonction intégrée python - min ()
  41. 从0起步学Python(附程序实例讲解)第1讲
  42. 从0起步学Python(附程序实例讲解)第1讲
  43. Apprendre Python à partir de 0 (avec des exemples de programme) leçon 1
  44. Apprendre Python à partir de 0 (avec des exemples de programme) leçon 1
  45. With Python, I'll take you to enjoy it for a month when the Mid Autumn Festival is coming
  46. You can't write interface software in Python! Which software on sale has no UI?
  47. Python国内外原题解析及源码1~15
  48. Python实现长篇英文自动纠错~
  49. Python implémente la correction automatique des erreurs en anglais long
  50. Analyse des problèmes originaux et code source de Python au pays et à l'étranger 1 ~ 15
  51. 一张思维导图学Python之表白
  52. Python教学中课程思政建设的研究探索2
  53. Recherche sur la construction idéologique et politique du Programme d'études dans l'enseignement Python 2
  54. Une présentation de la cartographie mentale Python
  55. Python高级用法总结(8)-函数式编程
  56. Python + Mirai development QQ robot starting tutorial (2021.9.9 test is valid)
  57. Python Advanced use Summary (8) - functional Programming
  58. How to get started with Python and share learning methods for free. All you want to know is here
  59. Python + Mirai development QQ robot starting tutorial (2021.9.9 test is valid)
  60. Python基础第1讲(含代码、Python最新安装包、父与子的编程之旅:与小卡特一起学Python中文版)