Путаница с термином ввод-вывод при использовании в разных настройках и в отношении GIL

Кажется, когда я гуглю, что такое ввод-вывод, я получаю ответы, которые показывают, что это означает «ввод» и «вывод». Я вижу блоги о Python под названием «Python File I\O — Part 19, Advanced File Input and Output». Если я перейду к документации Python и найду ввод/вывод: .org/3/tutorial/inputoutput.html" rel="nofollow noreferrer">https://docs.python.org/3/tutorial/inputoutput.html Примеры ограничены операторами печати и чтением/записью файлы.

Я не вижу примеров веб-сервисов или сетей в качестве ввода/вывода в разделе «Ввод и вывод» документов Python, несмотря на то, что термин «ввод-вывод» часто используется с этими понятиями. Имеет ли ввод-вывод такое же значение, когда речь идет о веб-сервисах и сетях?

Недавно я много читал о GIL и многопоточности, и в дополнение к I/O появился термин I/O bound.

Привязка ввода-вывода, по-видимому, относится к состоянию, в котором ЦП много простаивает из-за медленности получения данных ЦП. Многопоточность, по-видимому, часто используется с веб-сервисами и сетями, потому что я предполагаю, что ЦП много простаивает, т.е. тяжелые задачи, связанные с вводом-выводом, потому что вы всегда ждете, когда пользовательский ввод будет действовать.

Теперь операторы print, а также файлы чтения/записи также считаются задачами, связанными с вводом/выводом?

Наконец, термин I/O также появился в документации по Python в отношении GIL:

«GIL вызывает споры, потому что он не позволяет многопоточным программам CPython в полной мере использовать преимущества многопроцессорных систем в определенных ситуациях. Обратите внимание, что потенциально блокирующие или длительные операции, такие как обработка изображений ввода-вывода и NumPy обработка чисел происходит за пределами GIL. Поэтому только в многопоточных программах, которые проводят много времени внутри GIL, интерпретируя байт-код CPython, GIL становится узким местом».

Таким образом, ссылка на ввод-вывод в этом тексте говорит о том, что все задачи ввода-вывода обходят GIL — значит ли это, что print, reading and write to files, webservices, networking и т. д. — все эти типы задач обходят GIL и могут быть использованы с помощью многопоточности?

Спасибо.


person Moondra    schedule 27.07.2017    source источник
comment
Операции в основном интерпретаторе или модулях расширения, которые могут блокировать или иным образом не нуждаться в интерпретаторе в течение относительно длительного времени, обычно заранее освобождают GIL, чтобы позволить другому потоку получить доступ к интерпретатору. Когда операция завершается, поток должен ждать, чтобы повторно получить GIL, прежде чем он сможет возобновить выполнение байт-кода Python.   -  person Eryk Sun    schedule 28.07.2017
comment
Спасибо. Как именно это определяется? Это интерпретатор или ОС определяет, какие операции займут много времени, а какие нет? Это жестко закодировано в интерпретаторе или в поведении ОС?   -  person Moondra    schedule 28.07.2017
comment
GIL — это блокировка, управляемая внутри процесса Python. Помимо того факта, что базовые примитивы (например, семафоры) зависят от ОС, высокоуровневое поведение является функцией реализации CPython. Точки, которые выпускают GIL, почти всегда жестко закодированы. Например, функция будет использовать макрос Py_BEGIN_ALLOW_THREADS для освобождения GIL перед системным вызовом чтение из файла.   -  person Eryk Sun    schedule 28.07.2017


Ответы (1)


Да, ввод/вывод означает ввод/вывод. Это с точки зрения вашей программы. Ввод может поступать из разных источников, таких как клавиатура, мышь или сетевое подключение. Точно так же выходные данные могут быть отправлены во множество различных источников. Большинство языков программирования определяют операции ввода и вывода, которые могут работать с различными источниками и получателями. Это значительно упрощает написание кода, потому что мы просто получаем и отправляем данные, не беспокоясь о деталях того, откуда они поступают и куда направляются.

person Code-Apprentice    schedule 27.07.2017