Это продолжение обсуждения в комментариях, в котором предполагалось, что этот вопрос основан на небольшом заблуждении: всегда стоит подумать о том, почему вам нужно выпустить GIL и действительно ли вам нужно это делать.
По сути, GIL — это флаг, который содержит каждый поток, чтобы указать, разрешено ли ему вызывать API Python. Простое удерживание флага не стоит вам никакого результата. Cython, как правило, работает быстрее, когда не использует Python API, но это из-за типа операций, которые он выполняет, а не из-за того, что он содержит флаг (т. е. printf
, вероятно, немного быстрее, чем Python print
, но printf
работает с той же скоростью с или без ГИЛ).
Единственный раз, когда вам действительно нужно беспокоиться о GIL, — это при использовании многопоточного кода, когда его освобождение дает возможность запускаться другим потокам Python. (Аналогичным образом, если вы пишете библиотеку и вам не нужен Python API, вероятно, было бы неплохо выпустить GIL, чтобы ваши пользователи могли запускать другие потоки, если они хотят).
Наконец, если вы находитесь в блоке nogil
и хотите выполнить быструю операцию Python, вы можете просто сделать:
with gil:
print c
Скорее всего, это не повлияет на производительность и сэкономит много усилий по программированию.
person
DavidW
schedule
22.01.2018
print
из нескольких потоков может легко закончиться просто получением беспорядочного вывода. - person DavidW   schedule 21.01.2018