Привет,ребят Почему потоки в Qt работают относительно плохо? Посмотрите gif Обычная программа для сортировки паролей по размеру. ЦП грузит на 6-8% Это хорошо с одной стороны, но хочется узнать, можно ли загрузить цп на фул? --- Сообщение объединено, 6 июн 2020 --- Логика потоков Код (Text): QFutureSynchronizer<void> synchronizer; QThreadPool::globalInstance()->setMaxThreadCount(ui.spinBox->value()); QThreadPool::globalInstance()->setExpiryTimeout(1000); const auto q_future = QtConcurrent::map(vector, [this](int &/*from_russia_with_love*/) { tasker(list[index++]); }); synchronizer.addFuture(q_future);
Не потоки работают плохо, а ты плохо составил задачу. У тебя 5000 ядер? Потоки тратят огромное время на синхронизацию и очень мало времени на целевой код. Если код внутри не предполагает ожидания на системных сервисах, выставляй количество потоков по количеству логических ядер. Если код предполагается ждущим - количество потоков удваивай (например, 8 физических ядер, 16 логических (SMT'шно-гипертрединговых), а потоков в твоём тредпуле 16 * 2 == 32). Это самое оптимальное количество потоков. Кроме того, сформируй задачу таким образом, чтобы поток выполнял её долго без необходимости каждые пять микросекунд дёргать синхронизацию с тредпулом для выборки новой задачи. Т.е., сразу создай каждому потоку набор задач, которые он может выполнять непрерывно. Тогда все ядра будут загружены на 100% и 99% времени будут заняты исключительно полезной работой.
Парсер сайтов - слишком широкое понятие. Парсер чего и для чего? И обратить внимание в какой области? Потому что для сайтов я могу обратить твоё внимание на HTML, но вряд ли это то, что ты хотел услышать.
допустим просто парсер названий сайта, в многопотоке, то есть есть список сайтов, прокси, и запускать это в 500 потоков
Это неэффективно. Работай с сайтами асинхронно: пул сокетов, каждый из которых опрашивай поллингом в одном потоке. Пришла порция данных - обработал. Т.к. сокеты бОльшую часть времени ждут, выделять под них полноценные потоки очень ресурсозатратно.