В недавнем «техническом обсуждении» меня спросили «как выполнить многопоточность с использованием одного потока?» После подтверждения того, что интервьюер не рассматривал этот вопрос, я должен был признать, что у меня не было хорошего идея, как добиться многопоточности в одном потоке, и, кроме того, я рассматривал этот вопрос как нечто противоречивое. Ответ, предоставленный интервьюером, «с помощью делегата многоадресной передачи» оставил меня в недоумении, может быть, он действительно не понимал делегатов и основную потоковую обработку. Мне было бы интересно узнать, имеет ли вопрос какие-либо заслуги и, что более важно, если соответствующий ответ имеет смысл. Спасибо.Как выполнить многопоточность с использованием одного потока?
ответ
Coroutines - это что-то для имитации совместной многопоточности (не поддерживается .NET, если мы не рассматриваем шаблон как образец сопрограммы).
Асинхронное программирование моделирует многопоточность (по крайней мере частично ... Одновременно выполняется несколько операций чтения/записи) ... Оба варианта - это возможные решения, которые скрывают часть «threading».
Для разработки асинхронного программирования ... Можно создать целый веб-сервер, способный одновременно отвечать на сотни запросов на основе одного потока + асинхронной разработки. Каждое чтение с диска будет выполняться асинхронно. Каждый ответ на подключение клиентов будет выполняться асинхронно и так далее.
Чтобы дать имя, от того, что я понимаю, node.js это однопоточный веб-сервер полностью основан на асинхронном программировании (технически называется не блокирующее I/O) ... Смотрите, например https://stackoverflow.com/a/14797359/613130
В какой Я написал, добавлю, что есть некоторые языки, которые реализуют так называемое Green threads. Зеленые потоки представляют собой совместные потоки, которые не используют планировщик ОС. Их код так выполняется в одном потоке (по крайней мере, с их точки зрения). Кажется, что Go, haskell, старый Ruby, различные версии Smalltalk используют/используют зеленые потоки).
asynchronous! = Multithreaded. основное отличие заключается в том, что для асинхронного кода он может запускать весь «блок» кода сразу, и он может заменяться только на другой раздел кода, когда заканчивается другой цельный блок. В многопоточной среде он может приостановить выполнение стека, заменить его другим контекстом и вернуться к предыдущему контексту. Я не вижу, как C# сможет это сделать; он слишком высок, чтобы выполнить его без помощи потоков. – Servy
@Servy Что я имел в виду, так это то, что с точки зрения внешнего наблюдателя асинхронный == многопоточный: одновременно с Node.js может обрабатываться более одного запроса. И поистине асинхронный похож на многопоточность, потому что вы оставляете операцию в ОС, которая будет выполнять ее на одном из своих потоков.Таким образом, вместо многопоточности «внутри» процесса, это многопоточность «по всему процессу и ОС». Да, это расщепление пресловутого волокна в 4, но вопрос был вопросом полупроворота, который требовал хотя бы немного бокового мышления. – xanatos
Но факт остается фактом: это не многопоточность. Это может означать, что человек, задающий вопрос, фактически имел в виду «асинхронный», а не «многопоточность». Если бы они это сделали, тогда это было бы ответом. – Servy
- 1. Многопоточность возвращает другой результат от одного потока
- 2. Многопоточность Python с использованием другой настройки для потока
- 3. Многопоточность: определение потока как класса
- 4. Как запустить два потока одного класса с использованием одного объекта с использованием QThread в cpp?
- 5. Как выполнить многопоточность в GWT?
- 6. python многопоточность с использованием python
- 7. Многопоточность в C++ ............ как выполнить?
- 8. Завершение одного потока (looping) с использованием другого потока
- 9. Многопоточность с использованием NXT
- 10. Многопоточность Java - Обновление одного массива
- 11. многопоточность с использованием python
- 12. многопоточность с использованием tcplistener
- 13. Многопоточность с использованием списка
- 14. Многопоточность с использованием сценария оболочки
- 15. Linux многопоточность, приостановка одного потока при продолжении работы других потоков в рамках одного процесса
- 16. Как выполнить распаковку после дешифрования потока с использованием CryptoPP
- 17. Многопоточность Python: как поддерживать поток потока daemon
- 18. Многопоточность WinApi C: как дождаться окончания потока?
- 19. Операция io с использованием одного и того же объекта потока
- 20. Использовать многопоточность для чтения файлов/обработки с использованием Java?
- 21. Недостаточно памяти: многопоточность с использованием hashset
- 22. многопоточность структуры с использованием mfc
- 23. java Многопоточность с использованием Executor
- 24. многопоточность с использованием vC++ 11
- 25. Java многопоточность чтения одного большого файла
- 26. Многопоточность с использованием библиотеки ускорения
- 27. Как многопоточность с использованием Codeigniter famework (PHP)?
- 28. многопоточность с использованием параметров _beginthreadex
- 29. Как выполнить синхронизацию потока с отдельного блока
- 30. Многопоточность с использованием WinAPI. Calculate PI
* трюк вопрос *, хотя :). –
Да; он понятия не имеет, о чем он говорит. Правильный ответ - это волокна. – SLaks
@SLaks Я бы сказал, что это еще не многопоточность. – hvd