вызовите несколько функций C ++ в Python, используя потоки - PullRequest
2 голосов
/ 13 мая 2010

Предположим, у меня есть функция C (++), принимающая целое число, и она связана с (C) python с помощью python api, поэтому я могу вызвать ее из python:

import c_module
c_module.f(10)

Теперь я хочу распараллелить это. Проблема в том, как работает GIL в этом случае? Предположим, у меня есть очередь чисел для обработки, и некоторые работники (threading.Thread) работают параллельно, каждый из них вызывает c_module.f(number), где number берется из очереди.

Разница с обычным случаем, когда GIL блокирует интерпретатор, состоит в том, что теперь вам не нужен интерпретатор для оценки c_module.f, потому что он скомпилирован. Таким образом, вопрос: в этом случае обработка действительно параллельна?

1 Ответ

3 голосов
/ 13 мая 2010

Потоки, в настоящее время выполняющие код расширения C, для которого GIL был явно освобожден, будут работать параллельно.См. http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock о том, что вам нужно сделать в своем расширении.

Потоки Python наиболее полезны для выполнения операций ввода-вывода или реагирования на графический интерфейс.Я бы не делал Python-Heavy-выполнение с потоками.Если вы хотите гарантированного параллелизма, посмотрите библиотеку multiprocessing.

...