Потоки в Qt

Тема в разделе "WASM.BEGINNERS", создана пользователем galenkane, 6 июн 2020.

  1. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    269
    Привет,ребят

    Почему потоки в Qt работают относительно плохо?

    Посмотрите gif

    [​IMG]

    Обычная программа для сортировки паролей по размеру.

    ЦП грузит на 6-8%

    Это хорошо с одной стороны, но хочется узнать, можно ли загрузить цп на фул?
    --- Сообщение объединено, 6 июн 2020 ---
    Логика потоков

    Код (Text):
    1.  
    2.   QFutureSynchronizer<void> synchronizer;
    3.  QThreadPool::globalInstance()->setMaxThreadCount(ui.spinBox->value());
    4.   QThreadPool::globalInstance()->setExpiryTimeout(1000);
    5.   const auto q_future = QtConcurrent::map(vector, [this](int &/*from_russia_with_love*/) {
    6.     tasker(list[index++]);
    7.   });
    8.   synchronizer.addFuture(q_future);
     

    Вложения:

    • pass_Sorter.gif
      pass_Sorter.gif
      Размер файла:
      102,7 КБ
      Просмотров:
      278
    Последнее редактирование: 6 июн 2020
  2. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.427
    Адрес:
    Россия, Нижний Новгород
    Не потоки работают плохо, а ты плохо составил задачу. У тебя 5000 ядер?
    Потоки тратят огромное время на синхронизацию и очень мало времени на целевой код.

    Если код внутри не предполагает ожидания на системных сервисах, выставляй количество потоков по количеству логических ядер. Если код предполагается ждущим - количество потоков удваивай (например, 8 физических ядер, 16 логических (SMT'шно-гипертрединговых), а потоков в твоём тредпуле 16 * 2 == 32).

    Это самое оптимальное количество потоков.

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

    Тогда все ядра будут загружены на 100% и 99% времени будут заняты исключительно полезной работой.
     
    galenkane нравится это.
  3. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    269
    на что обратить внимание, если пишу парсер сайтов?
     
  4. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.427
    Адрес:
    Россия, Нижний Новгород
    Парсер сайтов - слишком широкое понятие. Парсер чего и для чего? И обратить внимание в какой области?
    Потому что для сайтов я могу обратить твоё внимание на HTML, но вряд ли это то, что ты хотел услышать.
     
  5. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    269
    допустим просто парсер названий сайта, в многопотоке, то есть есть список сайтов, прокси, и запускать это в 500 потоков
     
  6. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.427
    Адрес:
    Россия, Нижний Новгород
    Это неэффективно. Работай с сайтами асинхронно: пул сокетов, каждый из которых опрашивай поллингом в одном потоке. Пришла порция данных - обработал.
    Т.к. сокеты бОльшую часть времени ждут, выделять под них полноценные потоки очень ресурсозатратно.