Маленькая преамбула:
Давно хотел поднять эту тему, но лезть в рассылку или irc-канал пока не хочу, поэтому давайте попробуем убить двух зайцев:
1) я напишу маленькую статейку по использованию тред-контекстов с-апи питона.
2) задам вопрос гуру, если таковые есть.
Заодно эта статья будет полезна тем кто хочет узнать как работают нити в питоне и взаимодействуют между собой.
Итак о нитях и встроенном питоне:
Все я думаю рано или поздно что-нибудь и куда-нибудь встраивают, кто то бытовую технику в кухню, ну а кто-то скриптовые языки программирования в свою программу. Иногда эта процедура легка и безболезненна, особенно в одно-поточных программах. Посудите сами: инициализировал интерпретатор, создал биндинги, выполнил скрипт, получил результат. Впрочем бывают не столь простые случаи, особенно если ваше приложение требует не блокирующей работы и/или нитей.
Специально для таких случае в с-питоне сделали тред-контексты: структуры для хранения глобального состояния интерпретатора. Именно они являются основой работы тредов и GIL-а при многопоточной работе.
Теперь несколько моментов по поводу инициализации интерпретатора для работы с нитями. К сожалению я не стал включать сюда курс по встраиванию питона, благо он отлично описан прямо в документации(
Встраивание питона в приложения на английском). Вместо этого я расскажу о тонкостях использования и работы с тред-контекстами. Так же если вы с питоном хотя бы на «сделай мне это, пожалуйста», то вы знаете о том что GIL не позволяет питону выполнять несколько потоков одновременно, блокируя конкурирующие потоки до тех пор пока GIL не будет отпущен. В среднем любой сишный модуль к питону, будь то математика или дисковое IO или сеть отпускает GIL чуть более чем дофига раз за свою работу. То есть GIL не гарантирует что во время выполнения одной нити, будут спать все остальные. Это очень важный момент для того кто решит встраивать питон и делать много нитей. И уж точно не стоит надеяться на то что ваш поток выполнится за один присест.