Как быть с одновременным привязкой ввода-вывода и ЦП в контексте параллелизма?

Возможно ли запустить несколько потоков на всех доступных процессорах, а не один? Пример кода был бы отличным.

В качестве альтернативы, могу ли я охватить несколько процессов, а затем создать многопоточность в каждом процессе?

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

Мой поток кода:

def worker(url):
    extract url (io bound)  
    process url content (cpu bound)

Каким должен быть эффективный способ работы с таким типом работников?


comment
Вы должны использовать многопроцессорность для этого из-за GIL   -  person Metareven    schedule 25.08.2017


Ответы (1)


Возможно ли запустить несколько потоков на всех доступных процессорах, а не один?

Как правило, потоки выполняются на любом доступном процессоре. Если вы не указали поток/процесс для запуска на конкретном процессоре. (Как это делается, зависит от операционной системы)

Однако если вы используете реализацию Python с сайта python.org ("CPython"), это не имеет значения. CPython имеет "глобальную блокировку интерпретатора", которая обеспечивает выполнение только одного потока в каждый момент времени с байт-кодом Python. Таким образом, использование потоков не приведет к повышению производительности обработки с помощью CPython.

Таким образом, для задач, требующих больших вычислительных ресурсов, вам, вероятно, следует использовать модуль multiprocessing, чтобы делать это в разных процессах. Если одна и та же работа выполняется с большим количеством данных, использование multiprocessing.Pool обычно является хорошей идеей.

person Roland Smith    schedule 25.08.2017