практиковаться с потоками в Python - PullRequest
2 голосов
/ 11 февраля 2009

Я знаю, что Python имеет глобальную блокировку , и я прочитал объяснение Глифа о многопоточности Python . Но я все еще хочу попробовать это. В качестве простой (концептуальной) задачи я решил сделать горизонтальное и вертикальное определение краев на изображении.

Вот что происходит (псевдокод):

for pixels in picture:
    apply sobel operator horizontal
for pixels in picture:
    apply sobel operator vertical

информация об операторе sobel .

Эти два цикла могут работать совершенно независимо друг от друга, и поэтому они будут первыми кандидатами на многопоточность. (запуск этих двух циклов на любом значительно большом изображении может занять более 10 секунд). Однако, когда я попытался использовать модуль threading в python, это занимает вдвое больше времени из-за глобальной блокировки. Мой вопрос должен ли я отказаться от всякой надежды сделать это в двух потоках в python и попробовать на другом языке? Если я могу продвинуться вперед, какие модули я должен использовать? Если нет, то на каком языке мне экспериментировать?

Ответы [ 5 ]

7 голосов
/ 11 февраля 2009

Python 2.6 теперь включает в себя модуль многозадачной обработки (ранее модуль обработки в более старых версиях Python).

По сути, он имеет тот же интерфейс, что и модуль threading , но запускает выполнение в отдельных процессах, а не в потоках. Это позволяет Python использовать преимущества нескольких ядер / процессоров и хорошо масштабируется для задач, интенсивно использующих процессор, по сравнению с подходом потокового модуля.

3 голосов
/ 11 февраля 2009

Если оператор sobel привязан к процессору, вы не получите никакой выгоды от нескольких потоков, поскольку python не использует преимущества нескольких ядер.

Возможно, вы могли бы выделить несколько процессов, хотя я не уверен, будет ли это практичным для работы с одним изображением.

10 секунд не похоже, чтобы тратить много времени. Если вас беспокоит время, поскольку вы будете обрабатывать много изображений, тогда может быть проще запустить несколько процессов, и каждый процесс будет иметь дело с отдельным подмножеством изображений.

2 голосов
/ 11 февраля 2009

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

Я также предлагаю использовать многопроцессорность, как предлагает Джей.

В любом случае, если вы действительно хотите потренироваться в многопоточности, я бы посоветовал поиграть с PThreads в C. PThreads безумно просты для использования в основных случаях и используются повсеместно.

0 голосов
/ 13 февраля 2009

Взаимодействие с Python - правильный выбор, если вы хотите попрактиковаться в параллельном программировании с Python. Если у вас нет Python 2.6 (чего нет, например, если вы используете Ubuntu), вы можете использовать версию многопроцессорной обработки кода с обратным портом Google. Он является частью PyPI, что означает, что вы можете легко установить его с помощью EasyInstall (который входит в пакет python-setuptools в Ubuntu).

0 голосов
/ 11 февраля 2009

Операции с массовыми матрицами, такие как оператор Собеля, определенно обеспечат значительное увеличение скорости благодаря (правильно) использованию Matlab / Octave . Возможно, что NumPy может обеспечить аналогичные ускорения для операций матрицы / массива.

...