Поскольку это вопрос дизайна, я не думаю, что код воздаст должное.
Я делаю программу для обработки и регистрации потока данных с высокой пропускной способностью и одновременно пытаюсь наблюдать за этими данными в реальном времени. (как производственная линия и инспектор, наблюдающий за производственной линией)
Я хочу распределить нагрузку между ядрами на моем компьютере, чтобы оставить место для будущей функциональности, но я не могу понять, могу ли я использовать для этого многопроцессорность. Кажется, что большинство примеров многопроцессорной обработки имеют начальные наборы данных и выходные данные, и им не нужно активно обмениваться данными на протяжении всего их жизненного цикла.
Могу ли я использовать многопроцессорность для активного взаимодействия между процессами или это плохая идея, и я должен придерживаться многопоточности?
@Carcigenicate просто стандартный python3
Тогда да, это будет CPython, и вам нужно будет изучить multiprocessing
, если вы работаете с данными.
@Carcigenicate хорошо, хорошо, я беспокоился, что процессы не должны быть настолько зависимы друг от друга по какой-то неизвестной мне причине
Многопроцессорность и многопоточность — это два разных способа выполнения кода.
В многопроцессорной обработке вы, по сути, просто увеличиваете вычислительную мощность (отсюда и название), поскольку используете больше процессоров.
Многопоточность — это когда ЦП в основном разбивает код на несколько «потоков» кода для одновременного выполнения нескольких задач.
Для Python, который обычно является линейным (т. е. он работает от строки 1 до конца кода по порядку), многопоточность лучше подходит для привязки к сети или многопроцессорности, если его процессор ограничен.
https://timber.io/blog/multiprocessing-vs-multithreading-in-python-what-you-need-to-know/
Так что разница в том, как получится код и как будет работать система, будет определять, используете ли вы многопроцессорность или многопоточность.
Если вы ожидаете, что вычисления, необходимые для обработки полной нагрузки обработки сигналов, превысят возможности одного ядра, вам следует рассмотреть возможность распределения нагрузки между несколькими ядрами с помощью многопроцессорной обработки.
Если вы ожидаете, что необходимые вычисления поместятся на одном ядре, но вы ожидаете, что множество медленных или блокирующих операций ввода-вывода задержат работу, вам следует рассмотреть многопоточность.
Если общая производительность является проблемой, вам следует пересмотреть возможность написания фактического решения на чистом обычном Python и вместо этого искать реализацию на другом языке или в версии Python, которая приблизит решение к аппаратному обеспечению. Конечно, вы все еще можете получить результат, который можно было бы использовать в обычной программе Python.
Какую реализацию Python вы используете? Если CPython, многопоточность возможна только для почти чисто задач ограничения ввода-вывода из-за GIL. Чтобы распределить фактическую работу между процессорами, вам понадобится многопроцессорность. И данные можно передавать в процессы после создания, предоставляя им объект очереди во время создания, в который вы помещаете данные извне процесса.