Каково различие между потоком и волокном?

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

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})})
})
166
задан Grzegorz Wierzowiecki 16 February 2014 в 10:35
поделиться

7 ответов

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

С потоками: текущий путь выполнения может быть прерван или прерван в любое время (примечание: этот оператор является обобщением и может не всегда выполняться в зависимости от ОС / потокового пакета / и т.д. ). Это означает, что для потоков целостность данных является большой проблемой, потому что один поток может быть остановлен в процессе обновления фрагмента данных, что оставляет целостность данных в плохом или неполном состоянии. Это также означает, что операционная система может использовать преимущества нескольких ЦП и ядер ЦП, выполняя более одного потока одновременно и предоставляя разработчику возможность защищать доступ к данным.

С волокнами: текущий путь выполнения только прерывается, когда волокно приводит к выполнению (то же примечание, что и выше). Это означает, что волокна всегда запускаются и останавливаются в четко определенных местах, поэтому целостность данных представляет собой гораздо меньшую проблему. Кроме того, поскольку волокнами часто управляют в пользовательском пространстве, дорогостоящие переключатели контекста и изменения состояния ЦП не требуется, что делает переход от одного волокна к другому чрезвычайно эффективным. С другой стороны, поскольку никакие два волокна не могут работать в одно и то же время, простое использование одних волокон не будет использовать преимущества нескольких процессоров или нескольких процессорных ядер.

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

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

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

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

149
ответ дан 23 November 2019 в 21:03
поделиться

Полосы и ZTemplates должны быть довольно легкими.

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

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

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

54
ответ дан 23 November 2019 в 21:03
поделиться

В Win32 волокно является своего рода потоком, управляемым пользователем. Волокно имеет свой собственный стек и свой собственный указатель инструкций и т. Д., Но ОС не планирует расписание: вы должны явно вызывать SwitchToFiber. Потоки, напротив, предварительно планируются операционной системой. Грубо говоря, волокно - это поток, который управляется на уровне приложения / среды выполнения, а не является истинным потоком ОС.

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

(Для этого же термина могут использоваться другие варианты использования; как уже было отмечено, это определение Win32.)

42
ответ дан 23 November 2019 в 21:03
поделиться

Обратите внимание, что в дополнение к потокам и волокнам Windows 7 представляет Планирование в пользовательском режиме :

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

Дополнительную информацию о потоках, волокнах и UMS можно получить, просмотрев Дейва Проберта: Внутри Windows 7 - Планировщик пользовательских режимов (UMS) .

12
ответ дан 23 November 2019 в 21:03
поделиться

Потоки планируются ОС (приоритет). ОС может в любой момент остановить или возобновить поток, но волокна более или менее управляются сами (кооперативно) и уступают друг другу. То есть программист контролирует, когда волокна выполняют свою обработку и когда эта обработка переключается на другое волокно.

7
ответ дан 23 November 2019 в 21:03
поделиться

Потоки изначально создавались как облегченные процессы. Аналогичным образом волокна представляют собой легкую нить, полагаясь (упрощенно) на сами волокна, чтобы планировать друг друга, уступая контроль.

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

7
ответ дан 23 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: