Алгоритм я должен создать новую тему? - PullRequest
0 голосов
/ 27 ноября 2009

Существует ли алгоритм, который проверяет, оправдывает ли создание нового потока производительность? В любом случае я установлю максимальное количество потоков, которые можно создать, но если я добавлю только одну задачу, для нее не будет преимуществом начинать новый поток. Я использую язык программирования Python.

Редактировать 1 #

Можно ли вообще ответить на этот вопрос или это вообще, потому что это зависит от того, над чем работают нити?

Ответы [ 4 ]

4 голосов
/ 27 ноября 2009

Python (по крайней мере, стандартный CPython) является особым случаем, потому что он не будет запускать более одного потока за раз, поэтому, если вы выполняете обработку чисел на нескольких ядрах, тогда чистый Python не является лучший выбор.

В CPython при выполнении кода на Python выполняется только один поток. Он защищен глобальной блокировкой интерпретатора 1004 *. Если вы собираетесь IO, спите или ждете с другой стороны, тогда потоки Python имеют смысл.

Если вы работаете с числами, то, возможно, вы все равно захотите сделать это в C-расширении. В противном случае многопроцессорная библиотека позволяет чистому коду Python использовать преимущества нескольких ядер.

В общем случае, не на языке Python: на вопрос невозможно ответить, потому что он зависит от:

  1. Будут ли вообще быстрее выполняться задачи в новом потоке>
  2. Какова стоимость создания новой темы?
  3. Какую работу содержат задания? (Связанный с вводом-выводом, связанный с процессором, связанный с сетью, связанный с пользователем)
  4. Насколько эффективна ОС при планировании потоков?
  5. Сколько общих данных / блокировок нужно для выполнения задач?
  6. Какие существуют зависимости между задачами?

Если ваши задачи независимы и привязаны к процессору, то лучше всего использовать одно ядро ​​на процессор - но в python вам понадобится несколько процессов, чтобы воспользоваться преимуществами.

3 голосов
/ 27 ноября 2009

Практическое правило: если поток будет выполнять ввод / вывод, возможно, его стоит разделить

Если выполняется сжатие чисел, то оптимальное количество потоков равно числу процессоров.

0 голосов
/ 27 ноября 2009

На этот вопрос нет общего ответа ... пока. Но есть тенденция. Поскольку компьютеры получают все больше и больше ядер ЦП (попробуйте купить новый однопроцессорный ПК ...), использование потоков становится стандартом де-факто.

Так что, если у вас есть какая-то работа, которую можно распараллелить, то во что бы то ни стало используйте модуль потоков и создайте пул рабочих. Это не сделает ваш код намного медленнее в худшем случае (всего один поток), но может сделать его намного быстрее, если у пользователя более мощный ПК.

В худшем случае ваша программа завершится менее чем через 100 мс -> люди не заметят замедления, но заметят ускорение с 8 ядрами.

0 голосов
/ 27 ноября 2009

Тестирование подскажет вам.

В основном попробуй, и бенчмарк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...