| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Большое кол-во потоков. |
| Автор: MasterOfCode 2.12.2008, 07:26 |
| Вообщем у меня есть программа которая выгружает из БД файлы. Работа проходит быстро, но хотелось бы еще быстрее. Принцип работы таков: программа запускает поток в котором цикл, в каждой итерации цикла происходит выгрузка файла. Довольно такой последовательный механизм. Хотелось бы сделать чтоб в каждой итерации цикла создавать свой поток на выгрузку одного файла. Есть два вопроса, первый чисто теоретический. Если в цикле 50 000 итераций и он создаст 50 000 потоков, то программа будет работать быстрее, не загнется? Как мне получить оповещение что поток прекратил работу? |
| Автор: diadiavova 2.12.2008, 08:50 |
| Я правильно понял проблему? Есть программа, работающая хорошо и быстро, так вот вопрос в том, а не вхренячить ли в неё полста тысяч потоков и посмотреть не загнётся ли. А потом ещё если не загнётся, то чтобы каждый поток(из 50000) выдавал оповещение, что дескать, работа выполнена. А оповестить легко, месседжбоксы запустить из каждого, и потом вручную закрывать. А если серьёзно, то мне как-то странно, что при таких условиях, вопрос в том, будет ли прога быстрее работать, а не медленнее. Я, конечно не пробовал(как-то не додумался), но мне почему-то кажется, что идея плохая. Многопоточность ведь это только видимость параллельного выполнения нескольких действий одновременно. Просто при такой расстановке сил будет создано 50000 лишних объектов и система вместо того, чтобы выполнять все действия в нужной последовательности будет метаться между потоками. Я тут не понимаю за счёт чего можно ожидать выигрыш в производительности, даже чисто теоретически. Хотя: я ни на чём не настаиваю - может и не прав. |
| Автор: SpaceSpace 2.12.2008, 08:59 |
| севетую потестить. пускай сначала 2 потока, если есть реальный выигрыш - остановись на 2ух, 3 - уже толпа в мире 2уядерных машин) |
| Автор: MasterOfCode 2.12.2008, 09:00 | ||||
На каждом разное, на моем одно, на других 2. А сколько даст?
Что произойдет в данном случаи когда итерации перевалят за N? |
| Автор: SpaceSpace 2.12.2008, 09:12 | ||
все что угодно. от простых тормозов и и зависания, до дедлоков и необходимости ребутить все нафик. смотри у тебя 2 узких места минимум: количество ядер, хард. Субд чтобы слить тебе инфу на хард -читает с него, хард занят, потом пишет в него - хард занят. если все файлы у тебя уже в памяти а не на диске то выгружать одновременно все равно будет только 1 файл. При увеличении количесва потоков все может начать работать медленнее. потесть, говорю же |
| Автор: Lazin 2.12.2008, 09:21 | ||||
да где-то после сотни начнутся жуткие тормоза
все будет ограничено скоростью работы жесткого диска, системного кэша и самой БД, если можешь, сделай выгрузку асинхронной |
| Автор: MasterOfCode 2.12.2008, 09:21 | ||
Ок. Для этого нужно:
Можно немножко подробнее? |
| Автор: Lazin 2.12.2008, 09:24 |
| у тебя есть БД, запрос к которой можно выполнить асинхронно, когда его выполнение завершится, тебе нужно будет начать запись на диск, то-же асинхронно, в этом случае действительно будут записываться несколько файлов параллельно. Добавлено через 45 секунд я это на шарпе никогда не делал, на принцип не зависит от ЯП, хоть на питоне пиши) |
| Автор: MasterOfCode 2.12.2008, 09:46 | ||
MSDN перервыл не где не нашел онного, кинте ссылкой плизз! |
| Автор: Lazin 2.12.2008, 11:01 |
| http://msdn.microsoft.com/en-us/library/kztecsys(VS.71).aspx |