2013-08-16 3 views
6

В недавнем «техническом обсуждении» меня спросили «как выполнить многопоточность с использованием одного потока?» После подтверждения того, что интервьюер не рассматривал этот вопрос, я должен был признать, что у меня не было хорошего идея, как добиться многопоточности в одном потоке, и, кроме того, я рассматривал этот вопрос как нечто противоречивое. Ответ, предоставленный интервьюером, «с помощью делегата многоадресной передачи» оставил меня в недоумении, может быть, он действительно не понимал делегатов и основную потоковую обработку. Мне было бы интересно узнать, имеет ли вопрос какие-либо заслуги и, что более важно, если соответствующий ответ имеет смысл. Спасибо.Как выполнить многопоточность с использованием одного потока?

+2

* трюк вопрос *, хотя :). –

+2

Да; он понятия не имеет, о чем он говорит. Правильный ответ - это волокна. – SLaks

+3

@SLaks Я бы сказал, что это еще не многопоточность. – hvd

ответ

4

Coroutines - это что-то для имитации совместной многопоточности (не поддерживается .NET, если мы не рассматриваем шаблон как образец сопрограммы).

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

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

Чтобы дать имя, от того, что я понимаю, node.js это однопоточный веб-сервер полностью основан на асинхронном программировании (технически называется не блокирующее I/O) ... Смотрите, например https://stackoverflow.com/a/14797359/613130

В какой Я написал, добавлю, что есть некоторые языки, которые реализуют так называемое Green threads. Зеленые потоки представляют собой совместные потоки, которые не используют планировщик ОС. Их код так выполняется в одном потоке (по крайней мере, с их точки зрения). Кажется, что Go, haskell, старый Ruby, различные версии Smalltalk используют/используют зеленые потоки).

+1

asynchronous! = Multithreaded. основное отличие заключается в том, что для асинхронного кода он может запускать весь «блок» кода сразу, и он может заменяться только на другой раздел кода, когда заканчивается другой цельный блок. В многопоточной среде он может приостановить выполнение стека, заменить его другим контекстом и вернуться к предыдущему контексту. Я не вижу, как C# сможет это сделать; он слишком высок, чтобы выполнить его без помощи потоков. – Servy

+1

@Servy Что я имел в виду, так это то, что с точки зрения внешнего наблюдателя асинхронный == многопоточный: одновременно с Node.js может обрабатываться более одного запроса. И поистине асинхронный похож на многопоточность, потому что вы оставляете операцию в ОС, которая будет выполнять ее на одном из своих потоков.Таким образом, вместо многопоточности «внутри» процесса, это многопоточность «по всему процессу и ОС». Да, это расщепление пресловутого волокна в 4, но вопрос был вопросом полупроворота, который требовал хотя бы немного бокового мышления. – xanatos

+1

Но факт остается фактом: это не многопоточность. Это может означать, что человек, задающий вопрос, фактически имел в виду «асинхронный», а не «многопоточность». Если бы они это сделали, тогда это было бы ответом. – Servy

Смежные вопросы