Руководство по разработке руководства

Синхронный и асинхронный

введение

Поскольку веб-приложения продолжают развиваться, JavaScript, как широко используемый язык программирования, также постоянно развивается и развивается. В веб-интерфейсной разработке JavaScript в основном используется для обработки пользовательского интерфейса браузера.Разработка пользовательского интерфейса представляет собой типичную однопоточную модель, управляемую событиями, поэтому JavaScript также сформировал парадигму программирования с асинхронной обработкой в ​​качестве основной парадигмы программирования. Однако в крупномасштабных и сложных приложениях проблемы и сложности, вызванные асинхронным программированием, становятся все более очевидными.

Появление Node.js привносит в JavaScript новую парадигму асинхронного программирования: циклы событий и функции обратного вызова. Эта парадигма программирования эффективна и лаконична и подходит для сценариев с высоким уровнем параллелизма и интенсивным вводом-выводом. Однако эта парадигма программирования также приносит свои проблемы и сложности.Особенно в крупномасштабных и сложных приложениях программистам приходится сталкиваться с проблемой вложенности множества функций обратного вызова, а также с проблемой асинхронного порядка вызовов, что увеличивает сложность. и сложность программы.

Чтобы решить эти проблемы и трудности, был создан fibjs. fibjs — это среда разработки серверов приложений, в основном предназначенная для разработки веб-серверов. Она основана на движке JavaScript Google v8 и выбирает другое решение для параллельного выполнения, отличное от традиционного обратного вызова. fibjs использует оптоволокно для изоляции сложностей бизнеса, вызванных асинхронными вызовами на уровне инфраструктуры, что значительно снижает сложность разработки и снижает проблемы с производительностью, вызванные частой асинхронной обработкой в ​​пользовательском пространстве. В то же время по сравнению с традиционной парадигмой асинхронного программирования ее парадигма синхронного программирования имеет преимущества, заключающиеся в большей читабельности, простой логике и простоте обслуживания.

В следующем материале мы представим преимущества и особенности fibjs и объясним, как использовать его решения для синхронного и асинхронного программирования на примерах.

введение волокна

fibjs — это высокопроизводительная серверная среда JavaScript, основанная на движке v8, в основном предназначенная для серверной веб-разработки. Запущенный в 2009 году, он уже обладает высокой стабильностью и производительностью и имеет широкий спектр применений в стране и за рубежом.

В fibjs волокно используется для решения проблемы между бизнес-логикой и обработкой ввода-вывода. Fiber отличается от традиционных концепций, таких как потоки, сопрограммы и процессы. Это легкий поток пользовательского уровня, который можно рассматривать как кооперативный многозадачный механизм. Fiber может выполнять бизнес-логику и операции ввода-вывода в различных контекстах, а также внутренне управлять ресурсами посредством предварительного выделения и повторного использования. По сравнению с традиционными потоками и процессами он более легкий, более гибкий и более эффективный.

По сравнению с другими библиотеками потоков (такими как pthread, WinThread, Boost.Thread и т. д.) Fiber имеет следующие преимущества:

  • Совместное планирование : Fiber — это совместное планирование, которое не требует упреждающего планирования со стороны ядра или операционной системы. Оно уменьшает частое переключение контекста, ускоряет скорость работы программы и позволяет избежать условий конкуренции и проблем тупиковой ситуации между потоками.

  • Легкость : каждое волокно занимает лишь небольшой объем стека, и в многопараллельных приложениях можно создать большое количество волокон, не вызывая проблемы, связанной с занятием слишком большого количества памяти.

  • Эффективность : волокно реализовано на основе характеристик самого языка JavaScript и в полной мере использует превосходную производительность движка v8, который быстрее, чем традиционные библиотеки потоков.

Используя оптоволокно, fibjs может разделить бизнес-логику и обработку ввода-вывода, тем самым инкапсулируя асинхронные вызовы в форму синхронных вызовов, делая написание и поддержку кода более простым и легким для чтения, и в то же время полностью раскрывая преимущества Язык JavaScript.

Синхронное программирование в fibjs

В асинхронном программировании вложенность функций обратного вызова может привести к плохой читаемости кода, легко вызвать проблему «ада обратных вызовов» и увеличить сложность кода и стоимость отладки. Парадигма синхронного программирования больше соответствует моделям человеческого мышления, делая структуру кода более понятной, легкой для чтения и поддержки, что может значительно повысить эффективность разработки и качество кода.

В fibjs синхронное программирование — это очень популярная и часто используемая парадигма программирования, которая делает структуру и логику кода более интуитивно понятными, простыми для понимания и обслуживания. Некоторые функции и модули синхронного программирования широко поддерживаются в fibjs, например util.sync, fs.readSync и т. д.

В fibjs вы можете напрямую синхронно вызывать асинхронные функции встроенных объектов:

1 2 3 4
const fs = require("fs"); const data = fs.readFile("/path/to/file"); console.log(data);

Вы также можете обернуть асинхронную функцию через util.sync и try...catch, чтобы волокно могло получить возвращаемое значение асинхронного вызова, тем самым добившись эффекта синхронизации, например:

1 2 3 4 5 6 7 8 9 10 11 12 13
// load module const coroutine = require("coroutine"); const util = require("util"); const fs = require("fs"); // use util.sync to wrap fs.readFile function readFile(path) { return util.sync(fs.readFile)(path); } // call the sync function const data = readFile("myfile.txt"); console.log(data);

В приведенном выше примере мы определили функцию с именем readFile и использовали util.sync для инкапсуляции асинхронной функции fs.readFile в синхронную функцию. Эта функция может напрямую возвращать данные посредством синхронных вызовов. Этот метод синхронного вызова аналогичен традиционной парадигме программирования JavaScript, с той разницей, что в fibjs поток не блокируется, а асинхронный эффект достигается через оптоволокно.

Как работает util.sync

util.sync — это эффективная функция-оболочка ядра. Следующий код JavaScript может выполнять аналогичные функции:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
const coroutine = require("coroutine"); function sync(func) { return function _warp() { var ev = new coroutine.Event(); var e, r; func.apply(this, [ ...arguments, function (err, result) { e = err; r = result; ev.set(); } ]); ev.wait(); if (e) throw e; return r; } }

Этот код определяет инструментальную функцию sync для преобразования асинхронной функции обратного вызова в синхронную вызывающую функцию. Он получает функцию func и возвращает новую функцию _wrap. Эта новая функция реализует функцию преобразования исходной функции в синхронный вызов. В функции _wrap сначала создается новый объект Event ev для планирования потоков и ожидания результатов асинхронного обратного вызова. Затем используйте метод apply для вызова исходной функции func с указанными параметрами и новой функцией обратного вызова в качестве параметров. Во время процесса вызова происходит асинхронный обратный вызов, и новая функция обратного вызова сохраняет возвращенные результаты в переменных e и r и пробуждает объект Event. Наконец, в зависимости от переменной e решается, выдать ли исключение или вернуть переменную r. Эта функция реализует решение для преобразования асинхронных функций обратного вызова в синхронные вызовы, что может улучшить читаемость и удобство обслуживания функции.

Асинхронное программирование в fibjs

В fibjs большинство асинхронных методов (включая методы ввода-вывода, сетевых запросов и т. д.) могут поддерживать как синхронные, так и асинхронные вызовы, что позволяет разработчикам в любое время выбирать, какой метод использовать в соответствии со своими потребностями в программировании.

Взяв в качестве примера fs.readFile(), мы можем использовать этот метод двумя способами:

Асинхронный метод: Обработайте результат чтения файла, передав функцию обратного вызова, например:

1 2 3 4 5 6
const fs = require("fs"); fs.readFile("/path/to/file", (err, data) => { if (err) throw err; console.log(data); });

Этот метод подходит для ситуаций, когда после чтения файла необходимо выполнить какие-то операции.

Синхронный метод: получите содержимое файла, не передавая функцию обратного вызова, например:

1 2 3 4
const fs = require("fs"); const data = fs.readFile("/path/to/file"); console.log(data);

В этом примере мы получаем содержимое файла, читая данные возвращаемого значения файла.Нет необходимости ждать, пока функция обратного вызова завершит чтение файла, прежде чем продолжить операцию. Этот метод подходит для ситуаций, когда вам необходимо выполнить некоторые операции до завершения чтения файла.

Видно, что эта функция поддержки как синхронных, так и асинхронных вызовов позволяет разработчикам использовать разные методы в соответствии со своими потребностями и сценариями разработки. В некоторых случаях синхронный код более читабелен, его легче поддерживать и отлаживать; в то время как в некоторых случаях асинхронный код может лучше улучшить скорость ответа и производительность кода.

Однако при использовании метода синхронизации необходимо соблюдать осторожность.В некоторых сценариях этот метод может блокировать текущее волокно. Поэтому нам необходимо выбрать подходящий метод программирования, исходя из реальных потребностей.

в заключение

В этой статье мы представляем стиль синхронного программирования и решения для асинхронного программирования fibjs, а также их преимущества и сценарии применения. Мы упоминали, что fibjs может снизить сложность эксплуатации и повысить эффективность разработки кода, используя оптоволокно для изоляции проблем бизнес-логики и производительности, вызванных асинхронной обработкой. В то же время мы также подчеркнули преимущества fibjs в обработке ввода-вывода и управлении памятью, что обеспечивает большое удобство разработки, тестирования и обслуживания.

Наконец, мы призываем читателей глубже изучить fibjs и принять участие в вкладе fibjs и общественной деятельности. Мы верим, что fibjs продолжит привлекать внимание и поддержку сообщества открытого исходного кода своей высокой производительностью и простотой использования.

👉【Горячее обновление серверного модуля