В настоящее время я чувствую, что использую многопоточность.
У меня есть 3 типа данных, A, B и C.
Каждый A
может быть преобразован в несколько B
s, и каждый B
может быть преобразован в несколько C
s.
Я заинтересован только в лечении C
с.
Я мог бы написать это довольно легко с парой функций преобразования. Но я поймал себя на реализацию его нитками, три очереди ( queue_a
, queue_b
и queue_c
). Два потока выполняют разные преобразования и один рабочий:
ConverterA
читаетqueue_a
и пишет вqueue_b
ConverterB
читаетqueue_b
и пишет вqueue_c
Worker
обрабатывает каждый элемент изqueue_c
Преобразования довольно приземленные, и я не знаю, слишком ли сложна эта модель. Но это кажется мне чрезвычайно надежным. Каждый «конвертер» может начать работать даже до того, как данные поступят в очереди, и в любой момент в коде я могу просто «отправить» новые A
s или B
s, и это вызовет конвейер преобразования, который, в свою очередь, вызовет задание работника. нить.
Даже полученный код выглядит проще. Но я все еще не уверен, злоупотребляю ли я темами для чего-то простого.
источник
Ответы:
Почти всегда проще мыслить последовательно, а затем модифицировать эту логику, чтобы лучше работать с потоками. И, как говорится в выражении: «Если оно не сломано, не чините его». Большинство программистов не используют потоки просто потому, что нет необходимости их использовать.
Если вы чувствуете себя более комфортно при использовании их, больше силы для вас. Однако знайте, что если потоки не обеспечивают повышения скорости за счет устранения узких мест, они почти наверняка замедляют вашу программу.
Также учтите, что системы, которые выделяют для процесса только один ЦП, будут моделировать несколько потоков одним потоком, чтобы сэкономить ресурсы (это не часто случается с современными компьютерами, хотя приложения для смартфонов все еще очень подвержены такому злоупотреблению). В этом случае, даже если вы устраняете узкие места с помощью потоков, на самом деле это будет медленнее, чем если бы вы вообще не использовали потоки.
И, возможно, самая тонкая причина проявлять осторожность при использовании потоков, но, что не менее важно, потоки имеют тенденцию делать то, чего вы не ожидаете. Да, если вы принимаете меры предосторожности, вы должны быть в порядке. Да, если ваши потоки не записывают в переменные, разделяемые между потоками, все будет в порядке. Тем не менее, связанные с потоками ошибки очень трудно найти. Поскольку я считаю, что программист не может полностью исключить возможность создания ошибок в коде, и поэтому программист должен принять меры для защиты от возможных ошибок, а не сосредоточиться на их полном устранении, вам определенно следует применить эту идею к найти нить ошибок, а также. Другими словами, знайте, что, несмотря на все ваши усилия,
Так что вы должны использовать темы в любом случае? Что ж, здоровое знание потоков - это, конечно, неплохая вещь, особенно если ты в этом разбираешься. Однако в последнее время движение было направлено на однопоточные языки, такие как node.js. Одним из основных преимуществ наличия одного потока является то, что его легко масштабировать, и некоторые оптимизации могут быть выполнены, если вы знаете, что инструкции должны выполняться последовательно (даже если оптимизация может означать, что инструкции, которые могут выполняться параллельно, могут работать асинхронно).
Тем не менее, я говорю, делай то, что тебе удобнее. По моему опыту, написание программы, которую вы понимаете, имеет более высокий приоритет, чем заставить ее работать быстрее. Просто убедитесь, что вы используете потоки, если считаете, что это помогает вам писать программу, а не потому, что вы хотите, чтобы она работала быстрее, поскольку вам не следует беспокоиться о производительности так сильно, как при написании программы (оптимизация важна, но тоже могу подождать).
источник