Параллельная обработка в Python а-ля Grand Central Dispatch? - PullRequest
4 голосов
/ 31 октября 2011

Есть ли способ сделать параллельную обработку в Python, используя концепции, подобные тем, которые есть у Apple Grand Central Dispatch ?Grand Central Dispatch с самого начала выглядит как хороший способ обработки параллельной обработки.

Если Python не имеет в основном эквивалентного модуля, каковы основные концепции Grand Central Dispatch, которые можно было бы с пользой реализовать в Python??

Я не знаю много о Grand Central Dispatch, поэтому возникает вопрос: мне бы хотелось знать , использует ли Grand Central Dispatch парадигмы, которые (1) еще не доступны в Python, и / или(2) может быть реализовано в Python .

Ответы [ 2 ]

4 голосов
/ 22 декабря 2012

Основной проблемой здесь является компилятор и часть ОС GCD.Чтобы запустить GCD, вам нужен компилятор для понимания блоков.Вы можете создать что-то, что работает аналогично при программировании, но оно не будет иметь такую ​​же производительность вообще.С GCD вы можете создавать и ставить в очередь тысячи Блоков, и все же, будет только 2 или 4 потока, выполняющих эти блоки.Если вы реализуете высокоуровневую функциональность блоков без принятия их компилятором, я вижу единственный способ использовать потоки для «имитации» блоков.Тогда использование тысяч потоков в системе с 2-4 ядрами процессора приведет к впечатляющему снижению производительности из-за переключения контекста и использования памяти.

Не только вам нужно правильное расширение компилятора для поддержки GCD,но также вам нужно правильное расширение ОС для управления очередями GCD, в которые блокируются блоки.Вам нужно, чтобы ОС работала так, чтобы она управляла тем, сколько потоков исполняется, и когда и сколько из них активировать, когда доступны ядра ЦП, для программы, использующей GCD.С GCD потоки и очереди независимы.Потоки просто извлекают блоки из очередей (легких структур данных), но из любой из них.Поэтому не имеет значения, сколько там блоков, потому что они представляют собой только фрагменты кода и указатели, хранящиеся где-то в основной памяти.

Вы просто не можете реализовать все эти низкоуровневые функции из python.И только реализуя высокоуровневый «GCD-способ программирования», вы собираетесь делать очень медленные программы, или, возможно, даже невозможно выполнить на персональном компьютере.

Итак, во-первых, например, Cython может поддерживать GCD,ОС, которую вы хотите использовать тоже.В Linux есть реализация libdispatch, доступная для Devian.Но он реализует только часть компилятора, поэтому программа запускает столько потоков, сколько ядер в системе, минус один.Поэтому я думаю, что это все еще не хороший вариант.Кто-то должен добавить поддержку ОС Linux для GCD, возможно, в качестве модуля ядра.

Ничего не скажешь о Windows.Я действительно не знаю.

Итак, первым естественным шагом должно стать добавление и тестирование поддержки CGD в Cython для Mac OS.Оттуда вы можете создать нативную библиотеку Python, которая внутренне использует библиотеку de Cython GCD, чтобы предлагать блоки и очереди обычным программистам на python.добавить блоки и очереди в качестве нативной функции Python.Это было бы удивительно XD

1 голос
/ 31 октября 2011

Python не имеет эквивалентного модуля, хотя Twisted использует многие из тех же базовых понятий (асинхронные API, основанные на обратном вызове).Модуль многопроцессорной обработки Python на самом деле использует подпроцессы, а не потоки, и также не особо эквивалентен.Наилучшим подходом, вероятно, будет тот, который используется MacRuby, который заключается в создании оболочек для GCD API и их использовании.В отличие от Python, разумеется, MacRuby также не имеет GIL (Global Interpreter Lock), и это снизит эффективность многопоточности в Python, поскольку различные потоки интерпретации попадают в GIL в разное время.Боюсь, с этим ничего не поделать, кроме редизайна языка.

...