Non thread safe что это
Есть разные способы установки всего необходимого программного обеспечения. Мы можем устанавливать компоненты по отдельности, а можем использовать уже готовые сборки на подобие Denwer или EasyPHP. В подобных сборках компоненты уже имеют начальную настройку и уже готовы для создания сайтов. Однако рано или поздно разработчикам все равно приходится прибегать к установке и конфигурации отдельных компонентов, подключения других модулей. Поэтому мы будем устанавливать все компоненты по отдельности. В качестве операционной системы будет использоваться Windows.
Что подразумевает установка PHP? Во-первых, нам нужен интерпретатор PHP. Во-вторых, необходим веб-сервер, например, Apache, с помощью которого мы сможем обращаться к ресурсам создаваемого нами сайта.
Для установки PHP перейдем на офсайт разработчиков https://www.php.net/downloads. На странице загрузок мы можем найти различные дистрибутивы для операционной системы Linux. Если нашей операционной системой является Windows, то нам надо загрузить один из пакетов со страницы https://windows.php.net/download.
Интерпретатор PHP имеет две версии: Non Thread Safe и Thread Safe. В чем разниц между ними? Версия Thread Safe позволяет задействовать многопоточность, тогда как Non Thread Safe — однопоточная версия. Выбрем версию Thread Safe .

Распакуем загруженный архив в папку, которую назовем php . Пусть эта папка у нас будет располагаться в корне диска C, а ее полный путь будет C:\php .
Теперь нам надо выполнить минимальную конфигурацию PHP. Для этого зайдем в распакованный архив и найдем там файл php.ini-development .

Это файл начальной конфигурации интерпретатора. Переименуем этот файл в php.ini и затем откроем его в текстовом редакторе.
Найдем в файле строку:
;extension_dir = "ext"
Эта строка указывает на каталог с подключаемыми расширениями для PHP. Расширения позволяют задействовать нам некоторую дополнительную функциональность, например, работу с базой данных. Все расширения находятся в распакованном каталоге ext .
Раскомментируем эту строку, убрав точку с запятой и укажем полный путь к папке расширений php:
extension_dir = "C:\php\ext"
Остальное содержимое файла оставим без изменений.
Теперь установим веб-сервер.
Что значит thread safe / non thread safe и какой выбирать при скачивании php?

Если будете настраивать PHP как FastCGI модуль(т.е. запуск для обработки каждого запроса нового экземпляра PHP), то потокобезопасность не нужна — выбирайте NTS, так как оно будет работать быстрее.
Если же будете настраивать как mod_php (например под Apache), то потокобезопасность необходима.
PS также некоторые расширения требуют потокобезопасной версии. На вскидку не вспомню какие, но точно были. Читайте документацию по необходимым расширениям.
Потоковая безопасность#
При работе с потоками есть несколько рекомендаций, а также правил. Если их соблюдать, работать с потоками будет проще и, скорее всего, не будет проблем именно из-за потоков. Конечно, время от времени, будут появляться задачи, которые потребуют нарушения рекомендаций. Однако, прежде чем делать это, лучше попытаться решить задачу соблюдая рекомендации. Если это невозможно, тогда надо искать как обезопасить решение, чтобы не были повреждены данные.
Очень важная особенность работы с потоками: на небольшом количестве потоков и небольших тестовых задачах «все работает». Например, вывод информации с помощью print, при подключении к 20 устройствам в 5 потоков, будет работать нормально. А при подключении к большому количеству устройств с большим количеством потоков окажется, что иногда сообщения «налазят» друг на друга. Такая особенность проявляется очень часто, поэтому не доверяйте варианту когда «все работает» на базовых примерах, соблюдайте правила работы с потоками.
Прежде чем разбираться с правилами, надо разобраться с термином «потоковая безопасность». Потоковая безопасность — это концепция, которая описывает работу с многопоточными программами. Код считается потокобезопасным (thread-safe), если он может работать нормально при использовании нескольких потоков.
Например, функция print не является потокобезопасной. Это проявляется в том, что когда код выполняет print из разных потоков, сообщения на стандартном потоке вывода могут смешиваться. Может выводиться сначала часть сообщения из одного потока, потом часть из второго, потом часть из первого и так далее. То есть, функция print не работает нормально (как положено) в потоках. В этом случае говорят, что функция print не является потокобезопасной (not thread-safe).
В общем случае, проблем не будет, если каждый поток работает со своими ресурсами. Например, каждый поток пишет данные в свой файл. Однако, это не всегда возможно или может усложнять решение.
С print проблемы потому что из разных потоков пишем в один стандартный поток вывода, а print не потокобезопасен.
В том случае, если надо все же из разных потоков писать в один и тот же ресурс, есть два варианта:
- Писать в один и тот же ресурс после того как работа в потоке закончилась. Например, в потоках 1, 2 и 3 выполнилась функция, ее результат по очереди (последовательно) получен из каждого потока, а затем записан в файл.
- Использовать потокобезопасную альтернативу (не всегда доступна и/или не всегда простая). Например, вместо функции print использовать модуль logging.
Рекомендации при работе с потоками:
- Не пишите в один и тот же ресурс из разных потоков, если ресурс или то, чем пишете не предназначено для многопоточной работы. Выяснить это, проще всего, погуглив что-то вроде «python write to file from threads».
- В этой рекомендации есть нюансы. Например, можно писать из разных потоков в один и тот же файл, если использовать Lock или использовать потокобезопасную очередь. Эти варианты, чаще всего, непросты в использовании и не рассматриваются в книге. Скорее всего, 95% задач, с которыми вы будете сталкиваться, можно решить без них.
- К этой категории относится запись/изменение списков/словарей/множеств из разных потоков. Сами по себе эти объекты потокобезопасны, но нет гарантии, что при изменении с одного и того же списка из разных потоков, данные в списке будут правильные. В случае, если надо использовать общий контейнер для данных для разных потоков, надо использовать очередь queue из модуля Queue. Она потокобезопасна и с ней можно работать из разных потоков.
- Если есть воможность, избегайте коммуникаций между потоками в процессе их работы. Это непростая задача и лучше постараться обойтись без нее.
- Соблюдайте принцип KISS (Keep it simple, stupid) — постарайтесь, чтобы решение было максимально простым.
Эти рекомендации, в целом, написаны для тех, кто только начинает программировать на Python. Однако, как правило, они актуальны для большиства программистов, которые пишут приложения для пользователей, а не фреймворки.
Модуль concurrent.futures, который будет рассматриваться дальше, упрощает соблюдение первого принципа «Не пишите в один и тот же ресурс из разных потоков…». Сам интерфейс работы с модулем к этому подталкивает, но конечно не запрещает его нарушать.
Однако, перед знакомством с concurrent.futures, надо рассмотреть основы работы с модулем logging. Он будет использоваться вместо функции print, которая не является потокобезопасной.
В чем разница между Non Thread Safe и Thread Safe при загрузке PHP? Какой выбрать новичку?

В nts сборке при изменении параметров окружения — они меняются реально. Смена chdir поменяет её во всех местах, включая связанные dll.
В ts сборке все эти операции делают вид что меняются и смена того же каталога повлияет только на значение внутренней переменной, которую можно прочитать через getcwd. Но никакой реальной смены окружения не произойдёт.
Тоже самое происходит и со всем остальным — просто изоляция всего окружения и имитация похожего поведения для того, что б один поток в программе не влиял на соседний.