Як я можу дізнатись, чи переживаю я багаторівневу нитку?


15

На даний момент я відчуваю, що перевантажую багаторівневу нитку.

У мене є 3 типи даних, A, B і C.

Кожен Aможе бути перетворений в кілька Bs, і кожен Bможе бути перетворений в кілька Cs.

Мене цікавить лише лікування Cs.

Я міг би написати це досить легко з парою функцій перетворення. Але я зловив себе на реалізацію його нитками, три черги ( queue_a, queue_bі queue_c). Дві нитки роблять різні перетворення, і один працівник:

  • ConverterAчитає з queue_aі пише вqueue_b
  • ConverterBчитає з queue_bі пише вqueue_c
  • Worker обробляє кожен елемент з queue_c

Конверсії є досить повсякденними, і я не знаю, чи ця модель занадто вивернута. Але мені це здається надзвичайно надійним. Кожен "конвертер" може почати працювати ще до того, як дані надійдуть в черги, і в будь-який момент в коді я можу просто "подати" нові As або Bs, і це спровокує конвеєр перетворення, що, в свою чергу, спровокує роботу працівника нитка.

Навіть отриманий код виглядає простіше. Але я все ще не впевнений, чи зловживаю нитками для чогось простого.


5
Я думаю, що це питання потрібно трохи скоротити, щоб скоротити, щоб переслідувати. Заголовок також вводить в оману - це здається, що ви збираєтеся запустити в обман (навіть якщо ви цього не зробите). Можливо, вам слід запитати щось ближче до "Як я можу зрозуміти, чи перестараю я багатопотокові?"
KChaloux

@KChaloux Я згоден. Я це відредагував, і сподіваюся, що він захоплює мої думки трохи краще.
ексгума

4
@exhuma Awesome. Ваш -1 стає +1
KChaloux

3
@KChaloux ... різницю відвідування туалету може змінити твій думок ... :)
exhuma

Ця онлайн-книга PDF, Підручник з зрілої оптимізації (щойно опублікована днями назад) розповідає про систематичні ефекти, в яких вплив модуля на загальну продуктивність системи іноді може перевищувати частку часу виконання модуля.
rwong

Відповіді:


17

Майже завжди простіше мислити послідовно, а потім пізніше модифікувати цю логіку, щоб краще працювати за допомогою ниток. І, як вислів іде: "Якщо він не порушений, не виправляйте його". Більшість програмістів не використовують нитки просто тому, що немає необхідності їх використовувати.

Якщо вам зручніше користуватися ними, більше сил вам. Однак знайте, що якщо потоки не забезпечують підвищення швидкості шляхом усунення вузьких місць, вони майже напевно сповільнюють вашу програму.

Також врахуйте, що системи, які присвячують лише одному процесору процес, змоделюють декілька потоків однією єдиною ниткою, щоб заощадити ресурси (це не часто трапляється з сучасними комп’ютерами, хоча додатки для смартфонів все ще дуже сильно піддаються цьому зловживанню). У цьому випадку, навіть якщо ви усунете вузькі місця за допомогою ниток, це насправді буде повільніше, ніж якщо ви взагалі не використовували потоки.

І, мабуть, найтонша причина обережності до використання ниток, але, безумовно, не менш важлива, нитки мають тенденцію робити те, чого ви не очікуєте. Так, якщо ви вживаєте запобіжних заходів, ви повинні бути добре. Так, якщо ваші потоки не записують до змінних, якими поділяються між потоками, вам слід добре. Однак, помилок, пов’язаних з потоками, дуже важко знайти. Оскільки я вважаю, що програміст ніколи не може повністю усунути можливість створювати помилки в коді, і тому програміст повинен вживати заходів щодо захисту від можливих помилок, а не зосереджуватися на повному їх усуненні, вам слід обов'язково застосувати цю ідею до жорсткого, щоб знайти також помилки з потоками. Іншими словами, знайте, що незважаючи на ваші найкращі зусилля,

Тож вам все-таки слід використовувати нитки? Що ж, здорове знання ниток - це, звичайно, не погана річ, особливо якщо ти стаєш хорошим у цьому. Однак рух пізно просувався до однопотокових мов, таких як node.js. Однією з головних переваг наявності одного потоку є те, що це легко масштабувати, і певні оптимізації можна зробити, якщо ви знаєте, що очікується, що інструкції будуть виконуватися послідовно (навіть якщо оптимізація може означати, що інструкції, які можна виконувати паралельно, можуть запускати асинхронно).

Тим не менш, я кажу, робіть те, що вам найбільше комфортно На мій досвід, написання програми, яку ви розумієте, має більший пріоритет, ніж змушення її працювати швидше. Просто не забудьте використовувати теми, коли ви думаєте, що це допомагає вам написати програму, а не тому, що ви хочете, щоб вона працювала швидше, оскільки ви не повинні так сильно турбуватися про продуктивність, як пишете програму (оптимізація важлива, але це також можна почекати).


Ви робите цікаві моменти. У моєму випадку конвеєрний конвеєр не про продуктивність. Йдеться про простоту коду / читаність. Робоча нитка - це про продуктивність. Кожне остаточне завдання виконується на віддаленій машині, а подання декількох завдань робить його значно швидшим.
ексгума

2
@exhuma Крім паралельного виконання через декілька потоків, ви також можете використовувати методи асинхронізації, як Futures / Promises, або стиль, орієнтований на зворотний виклик. Зверніть увагу, що ви можете моделювати трубопроводи, прив'язуючи ітератори / потоки; фактично не потрібно використовувати нитки - за винятком випадків, коли ви хочете використовувати декілька процесорів (у мережевому коді це майже ніколи не буває)
amon

@exhuma Так, нитки допомагають у загальній продуктивності. Моя думка полягала в тому, що якщо ви цього не робите, тому що це занадто повільно, тоді ви повинні це зробити, тому що це допомагає вам написати програму. Оптимізація завжди повинна прийти пізніше. Можливо, навіть видалення ниток з вашої програми оптимізує її (хоча це не так для більшості програмістів).
Ніл

ОТ: Я люблю твій аватар. Змушує мене посміхатися.
Мар'ян Венема

@exhuma, я погоджуюся з цією відповіддю, але я додам до нього, що якщо ви збираєтесь використовувати нитки для простоти коду, це добре, але будьте дуже обережні, щоб ви зрозуміли безпеку потоку та потенційні проблеми з кількома потоками. Те, що може здатися простим фрагментом багатопотокового коду, може легко мати приховані умови перегонів, які можуть призвести до асортименту дуже важких для відстеження помилок.
Бен Лі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.