Отсутствие проблем с производительностью с потоковой передачей и глобальной блокировкой интерпретатора Python. Масштабируемость?

У меня не было проблем с производительностью с Python Global Interpreter Lock. Мне пришлось сделать несколько вещей поточно-ориентированными - несмотря на распространенные советы, GIL автоматически НЕ гарантирует потокобезопасность - но у меня есть программа, которая обычно запускает более 10 потоков, где все они могут быть активны в любой момент. время, в том числе вместе. Это довольно сложная асинхронная система обмена сообщениями.

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

Я использую 2.7 и использую рекурсивные блокировки, несмотря на их снижение производительности.

У меня такой вопрос: столкнусь ли я с проблемами масштабирования с GIL? Пока я не видел проблем с производительностью. Измерять это ... проблематично. Есть ли несколько потоков или что-то подобное, что вы ударяете, и оно просто начинает задыхаться? Существенно ли отличается производительность GIL от выполнения многопоточного кода на одноядерном процессоре?

Спасибо!


person std''OrgnlDave    schedule 26.08.2016    source источник
comment
Никто в здравом уме не сказал бы, что GIL гарантирует безопасность потоков. Он существует для защиты внутренних компонентов интерпретатора, так что вы на самом деле не столкнетесь с ошибкой, и по совпадению выполняет некоторые типы операций (реализованные в C, выполняющие всю работу, зависящую от состояния в инструкции однобайтового кода), атомарными. Но он не может заставить x += 1 работать безопасно в двух разных потоках, потому что байтовый код для этого включает в себя загрузку x, добавление одного и сохранение обратно в x, а интерпретатор может поменять местами GIL на любом промежуточном этапе. GIL предназначен не для логической безопасности, а для целостности интерпретатора; для отдыха используйте замки.   -  person ShadowRanger    schedule 26.08.2016


Ответы (1)


GIL - сложная тема, и точное поведение в вашем случае трудно объяснить без вашего кода. Поэтому я не могу сказать вам, столкнетесь ли вы с проблемами в будущем. Я могу просто посоветовать вам перенести проект на последнюю версию Python 3, если это возможно. В Python 3 было внесено много улучшений в GIL.

Это не что иное, как магическое количество потоков, на которых Python сломается. Общее правило таково: чем больше потоков, тем больше проблем. Самое сложное - от одного до двух.

GIL выпускается в некоторых ситуациях, особенно когда выполняется код C или выполняется ввод-вывод. Это позволяет коду работать параллельно. С расширенными возможностями современных процессоров было бы неразумно ограничивать ваш код только одним процессором.

person Klaus D.    schedule 26.08.2016