2013-07-26 2 views
1

У меня есть некоторый код, который выглядит следующим образом:распараллелить цикл в Python 2.4

for item in list: 
    <bunch of slow python code, depending only on item> 

Я хочу, чтобы ускорить этот процесс за счет распараллеливания цикла. Обычно модуль multiprocessing был бы идеальным для этого (см. Ответы на this question), но он был добавлен в python 2.6, и я застрял с использованием 2.4.

Каков наилучший способ распараллеливания цикла python в python 2.4?

+0

Вы действительно застряли в python 2.4? Даже если вы используете старую систему Linux, вы обычно можете скомпилировать свою собственную версию более поздней версии Python (heck, даже Python 3.x), а затем поместить ее в локальный каталог, чтобы она не мешала системные установки по умолчанию. – HardlyKnowEm

+0

Кроме того, вы можете записать медленную часть кода в C и использовать потоки. Threading не страдает от проблемы с Global Interpreter Lock, если вы не используете интерпретатор в низкоуровневом C-коде. – HardlyKnowEm

+0

@mlefavor: У меня на самом деле установлен python3.2 в моем домашнем каталоге, но '<медленный код на Python>' зависит от кучки библиотек (matplotlib, scipy и некоторых собственных вещей), я не хочу для установки. Это та же самая причина, по которой я не хочу переписывать ее в C. – Dan

ответ

1

Возможно, вы ищете «вилку», которая позволит легко использовать конкретный элемент.

Ваша за цикл нужно будет выглядеть немного иначе, хотя - вы хотите, чтобы выйти, как только вилка возвращает ноль.

import os 

L = ["a", "b", "c"] 

for item in L: 
    pid = os.fork() 
    if pid == 0: break 
    else: print "Forked:", pid 

if pid != 0: print "Main Execution, Ends" 
else: print "Execution:", item 
+0

Это может вызвать проблему, поскольку список очень длинный (сотни элементов в списке). Так как это обычно так, есть ли простой способ обеспечить одновременное выполнение только «n» forked-процессов? – Dan

+0

Выбрал это; Я могу просто использовать numpy.array_split(). – Dan

0

Я не знаком с использованием python 2.4, но вы пробовали использовать subprocess.Popen и просто нерест новых процессов?

from subprocess import Popen 

for x in range(n): 
    processes.append(Popen('python doWork.py',shell = True)) 

for process in processes: 
    process.wait() 
Смежные вопросы