Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Многопоточность в вебсервисе
|
|||
|---|---|---|---|
|
#18+
Что происходит с вебсервисом, когда когда он вызывает другой поток асинхронно? Есть следующая ситуация - вебсервис вызывает другой вебсервис, этот второй вебсервис может занять много времени для выполнения, скажем 1 минуту. Т.е. если его вызывать синхронно, то первый вебсервис будет висеть ожидая окончания, а если он вызван много раз одновременно для разных документов (каждый вызов сервиса - для определенного документа и может быть вызван много раз в секунду, скажем 100 раз) - то то на сервере образуется много висящих потоков, сотни их, занимающих память. Есть следующая идея ограничить количество этих потоков - вызывать внутренний сервис асинхронно, передавая ему коллбэк функцию. Правильно-ли я понимаю, что вызвав второй вебсервис, первый вебсервис будет уничтожен и не будет отжирать память? А как только коллбэк будет возвращен - первоначальный вебсервис "возродится" и продолжит работу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2013, 06:34 |
|
||
|
Многопоточность в вебсервисе
|
|||
|---|---|---|---|
|
#18+
нашел следующее: Avoid Asynchronous Calls Unless You Have Additional Parallel Work Make asynchronous calls from your Web application only when your application has additional parallel work to perform while it waits for the completion of the asynchronous calls, and the work performed by the asynchronous call is not CPU bound. Internally, the asynchronous calls use a worker thread from the thread pool; in effect, you are using additional threads. At the same time that you make asynchronous I/O calls, such as calling a Web method or performing file operations, the thread that makes the call is released so that it can perform additional work, such as making other asynchronous calls or performing other parallel tasks. You can then wait for completion of all of those tasks. Making several asynchronous calls that are not CPU bound and then letting them run simultaneously can improve throughput. http://msdn.microsoft.com/en-us/library/ms998549.aspx#scalenetchapt06_topic8 так все-таки стоит вызывать асинхронно другой вебсервис для "экономии" трэдов, или нет? т.е. я вызвал асинхронно вебсервис, мой первоначальный трэд убился, но для обработки асинхронного вызова взяли еще один трэд? Т.е. вышли в ноль по количеству потоков получается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2013, 08:56 |
|
||
|
Многопоточность в вебсервисе
|
|||
|---|---|---|---|
|
#18+
имхо первопричина не экономия памяти, а исключение блокировок рабочих потоков. http://stackoverflow.com/questions/17872854/synchronous-vs-asynchronous-related-to-web-services ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2013, 09:21 |
|
||
|
Многопоточность в вебсервисе
|
|||
|---|---|---|---|
|
#18+
ок, исключение блокировок, т.е. существует лимит доступных трэдов, если все из них залочены - то начинаются тормоза. но я правильно понимаю, что использование асинхронного вызова поможет только в случае, если первичному потоку есть чем заняться в то время, как идет обработка асинхронного вызова? Т.е. вызвал удаленный сервис, сам занимается чем-то полезным ожидая окончания, в результате общее время работы меньше? У меня-же сервис должен знать результат вызова к удаленному сервису перед тем как продолжить работу, т.е. если я вызову его асинхронно, то сделаю ситуацию еще хуже, т.к. теперь будет работать аж 2 трэда? Первоначальный трэд получается никуда не денеться, и все равно будет недоступен? Все верно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2013, 09:32 |
|
||
|
Многопоточность в вебсервисе
|
|||
|---|---|---|---|
|
#18+
более наглядно: Есть вебсервис, выполняющий следующее: Код: c# 1. 2. 3. 4. 5. 6. Вызов Function1() зовет сторонний вебсервис и занимает это 1 минуту, т.е. если использовать такой сервис, то будет масса висящих трэдов, которые ничего не делают, но блокируют остальные вызовы. Если переписать его вот так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. то что именно будет происходить с трэдами? Трэд, выполняющий Function1Async будет "убит" и станет доступен другим вызовам, но будет возрожден как только CallBack вернет результат? Либо он все равно не будет освобожден и будет мешатся? И что происходит при асинхронном вызове, занимается еще один трэд, который всецело занят обработкой CallBack? Другими словами, имеем 20 свободных трэдов. Выполнился вызов вебметода, трэдов стало 19 Вызвали Function1Async() - сколько свободных трэдов теперь? 19 или 18 или может вообще 20? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2013, 09:53 |
|
||
|
Многопоточность в вебсервисе
|
|||
|---|---|---|---|
|
#18+
не верно. Ваш первоначальный поток будет заниматься чем угодно, что на него возложат. и в .net изза тридпула потоки всегда висят в ожидание задач, что удобно. после асинхронного метода поток может сменится на другой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2013, 09:57 |
|
||
|
Многопоточность в вебсервисе
|
|||
|---|---|---|---|
|
#18+
handmadeFromRuне верно. Ваш первоначальный поток будет заниматься чем угодно, что на него возложат. и в .net изза тридпула потоки всегда висят в ожидание задач, что удобно. после асинхронного метода поток может сменится на другой. ну тогда после вызова Function1Async() сколько свободных потоков-то в пуле, 19 или 20 тогда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2013, 09:59 |
|
||
|
Многопоточность в вебсервисе
|
|||
|---|---|---|---|
|
#18+
handmadeFromRuпосле асинхронного метода поток может сменится на другой. смена потока происходит только при асинхронном IO ( http://www.lhotka.net/weblog/ASPNETThreadSwitching.aspx) stenford, я был не прав, ведь как обработать запрос, если все еще ждешь данных от веб-сервиса, думаю поток основной будет ждать как ни крути. async это просто удобный способ написания конечных автоматов для параллельных операций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2013, 10:32 |
|
||
|
|

start [/forum/topic.php?fid=18&msg=38427504&tid=1358037]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 310ms |

| 0 / 0 |
