Вопрос заключается в асинхронном запросе БД, о котором нужно позаботиться. Первое, что вы можете сделать, чтобы сделать его легким и читабельным, - это создание обещания запроса.
function dbQueryPromise(query) {
return new Promise((resolve, reject) => {
con.query(query, (err, results) => {
if(err) return reject(err);
resolve(results);
})
})
}
Теперь вы можете использовать это обещание для управления вашим необходимым поведением:
dbQueryPromise("SELECT id FROM products WHERE name LIKE '%" + req.body.keyword + "%'")
.then(results => {
const promiseArray = results.map(result => {
return dbQueryPromise("SELECT products.id AS id, products.name AS name, products.price AS price, SUM(enter.quantity) AS quantity FROM products JOIN enter ON products.id = enter.id_prod WHERE enter.id_prod = "+mysql.escape(result.id)+";")
})
Promise.all(promiseArray).then(allResults => { res.render('inventory', { results: allResults})})
})
В самых простых терминах нити, как правило, считаются преимущественными (хотя это может быть не всегда верно, в зависимости от операционной системы), в то время как волокна считаются легкими совместными нитями. , Оба являются отдельными путями выполнения для вашего приложения.
С потоками: текущий путь выполнения может быть прерван или прерван в любое время (примечание: этот оператор является обобщением и может не всегда выполняться в зависимости от ОС / потокового пакета / и т.д. ). Это означает, что для потоков целостность данных является большой проблемой, потому что один поток может быть остановлен в процессе обновления фрагмента данных, что оставляет целостность данных в плохом или неполном состоянии. Это также означает, что операционная система может использовать преимущества нескольких ЦП и ядер ЦП, выполняя более одного потока одновременно и предоставляя разработчику возможность защищать доступ к данным.
С волокнами: текущий путь выполнения только прерывается, когда волокно приводит к выполнению (то же примечание, что и выше). Это означает, что волокна всегда запускаются и останавливаются в четко определенных местах, поэтому целостность данных представляет собой гораздо меньшую проблему. Кроме того, поскольку волокнами часто управляют в пользовательском пространстве, дорогостоящие переключатели контекста и изменения состояния ЦП не требуется, что делает переход от одного волокна к другому чрезвычайно эффективным. С другой стороны, поскольку никакие два волокна не могут работать в одно и то же время, простое использование одних волокон не будет использовать преимущества нескольких процессоров или нескольких процессорных ядер.
текущий путь выполнения прерывается только тогда, когда волокно приводит к выполнению (то же примечание, что и выше). Это означает, что волокна всегда запускаются и останавливаются в четко определенных местах, поэтому целостность данных представляет собой гораздо меньшую проблему. Кроме того, поскольку волокнами часто управляют в пользовательском пространстве, дорогостоящие переключатели контекста и изменения состояния ЦП не требуется, что делает переход от одного волокна к другому чрезвычайно эффективным. С другой стороны, поскольку никакие два волокна не могут работать в одно и то же время, простое использование одних волокон не будет использовать преимущества нескольких процессоров или нескольких процессорных ядер. текущий путь выполнения прерывается только тогда, когда волокно приводит к выполнению (то же примечание, что и выше). Это означает, что волокна всегда запускаются и останавливаются в четко определенных местах, поэтому целостность данных представляет собой гораздо меньшую проблему. Кроме того, поскольку волокнами часто управляют в пользовательском пространстве, дорогостоящие переключатели контекста и изменения состояния ЦП не требуется, что делает переход от одного волокна к другому чрезвычайно эффективным. С другой стороны, поскольку никакие два волокна не могут работать в одно и то же время, простое использование одних волокон не будет использовать преимущества нескольких процессоров или нескольких процессорных ядер. нет необходимости вносить дорогостоящие переключения контекста и изменения состояния процессора, что делает переключение с одного волокна на другое чрезвычайно эффективным. С другой стороны, поскольку никакие два волокна не могут работать в одно и то же время, простое использование одних волокон не будет использовать преимущества нескольких процессоров или нескольких процессорных ядер. нет необходимости вносить дорогостоящие переключения контекста и изменения состояния процессора, что делает переключение с одного волокна на другое чрезвычайно эффективным. С другой стороны, поскольку никакие два волокна не могут работать в одно и то же время, простое использование одних волокон не будет использовать преимущества нескольких процессоров или нескольких процессорных ядер.Полосы и ZTemplates должны быть довольно легкими.
С несколькими процессорами вы можете иметь несколько потоков, работающих одновременно (многопоточность или многопоточность ). В результате вы должны быть очень осторожнее с одновременным доступом к данным и защищать свои данные с помощью мьютексов, семафоров, переменных условий и так далее. Часто бывает очень сложно разобраться в правильности. С волокном управление переключается только тогда, когда вы говорите это, обычно с вызовом функции с именем что-то вроде yield ()
. Это облегчает одновременный доступ к данным, поскольку вам не нужно беспокоиться об атомарности структур данных или мьютексов. Пока вы не уступите, нет опасности быть вытесненным и иметь другое волокно, пытающееся прочитать или изменить данные, с которыми вы работаете. В результате, однако, если ваше волокно попадает в бесконечный цикл, никакое другое волокно не может работать, поскольку вы не уступаете.
Вы также можете смешивать нити и волокна, что порождает проблемы, с которыми сталкиваются оба. Не рекомендуется, но иногда это может быть правильным, если все сделано осторожно.
В Win32 волокно является своего рода потоком, управляемым пользователем. Волокно имеет свой собственный стек и свой собственный указатель инструкций и т. Д., Но ОС не планирует расписание: вы должны явно вызывать SwitchToFiber. Потоки, напротив, предварительно планируются операционной системой. Грубо говоря, волокно - это поток, который управляется на уровне приложения / среды выполнения, а не является истинным потоком ОС.
В результате волокна становятся дешевле и приложение имеет больший контроль над планированием. Это может быть важно, если приложение создает много параллельных задач и / или хочет тесно оптимизировать их выполнение. Например, сервер базы данных может выбрать использование волокон, а не потоков.
(Для этого же термина могут использоваться другие варианты использования; как уже было отмечено, это определение Win32.)
Обратите внимание, что в дополнение к потокам и волокнам Windows 7 представляет Планирование в пользовательском режиме :
Планирование в пользовательском режиме (UMS) является легкий механизм, который приложения могут использовать для планирования своих собственные темы. Приложение может переключаться между потоками UMS в пользовательском режиме без участия системного планировщика и восстановить контроль над процессором, если поток UMS блокируется в ядре. UMS нити отличаются от волокон тем, что каждый поток UMS имеет свой собственный поток контекст вместо общего потока контекст одного потока. возможность переключения между потоками в пользовательский режим делает UMS более эффективной чем пулы потоков для управления большими количество коротких рабочих элементов которые требуют нескольких системных вызовов.
Дополнительную информацию о потоках, волокнах и UMS можно получить, просмотрев Дейва Проберта: Внутри Windows 7 - Планировщик пользовательских режимов (UMS) .
Потоки планируются ОС (приоритет). ОС может в любой момент остановить или возобновить поток, но волокна более или менее управляются сами (кооперативно) и уступают друг другу. То есть программист контролирует, когда волокна выполняют свою обработку и когда эта обработка переключается на другое волокно.
Потоки изначально создавались как облегченные процессы. Аналогичным образом волокна представляют собой легкую нить, полагаясь (упрощенно) на сами волокна, чтобы планировать друг друга, уступая контроль.
Я полагаю, что следующим шагом будут нити, где вы должны отправлять им сигнал каждый раз, когда вы хочу, чтобы они выполнили инструкцию (в отличие от моего 5летнего сына :-). В старые времена (и даже сейчас на некоторых встраиваемых платформах) все потоки были оптоволоконными, не было приоритета, и вам приходилось писать свои потоки, чтобы они вели себя хорошо.