2012-04-24 2 views
2

Я пытаюсь обновить скрипт python, который запускает исполняемый файл в Windows и управляет текстовыми выходными файлами, в версию, использующую несколько процессов с несколькими потоками, поэтому я могу использовать более одного ядра. У меня есть четыре отдельные версии исполняемого файла, которые каждый поток знает для доступа. Эта часть работает нормально. Когда я сталкиваюсь с проблемами, это когда они работают одновременно и пытаются открыть (разные) выходные файлы, чтобы гарантировать, что они работают правильно и реагируют в зависимости от содержимого выходного файла.python многопоточные процессы для запуска исполняемых файлов

В частности, при выполнении трех нитей, две разобьет со следующей ошибкой, в то время как один продолжает работать:

Exception in thread Thread-4: 
Traceback (most recent call last): 
    File "C:\Python27\lib\threading.py", line 552, in __bootstrap_inner 
    self.run() 
    File "E:\HDA\HDA-1.0.1\Hm-1.0.1.py", line 782, in run 
    conf = self.conf_file(Run) 
    File "E:\HDA\HDA-1.0.1\Hm-1.0.1.py", line 729, in conf_file 
    l = open(self.run_dir(Run)+Run, 'r').readlines()  #list of file lines 
IOError: [Errno 2] No such file or directory: 'Path/to/Outputfile' 

В результате из потока не работает правильно исполняемым (т.е. почему «путь/к/Outputfile 'не был создан и, следовательно, не может быть найден). Но один из потоков делает это правильно, в то время как другие два не могут. Есть ли причина, по которой я не могу получить несколько потоков, выполняющих разные версии исполняемого файла?

+3

Использовать темы У меня проблемы с двумя «Я знаю», я думаю –

+1

Типичным вопросом был бы вызов os.chdir() где-то, поскольку текущий рабочий каталог является свойством процесса. – schlenk

ответ

2

Я не думаю, что GIL сам по себе не убил бы это сам, если только открытие файла не приведет вас в какое-то странное тупиковое состояние или состояние спин-блокировки. В общем, вы хотите темы в таких случаях, где вы I/O-bound. Фактически, тот факт, что потоки могут запускаться одновременно, вероятно, влияет на другие потоки, а не на успешное открытие файла несколько раз.

On slide fifteen of this presentation, автор указывает, что GIL выпускает блокировку вызовов ввода-вывода, чтобы дать другим потокам шанс.

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

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

Одна мысль - попробовать multiprocessing. Я подозреваю, что вам повезет с чтением файла через несколько процессов, а не с потоками.

Вот пример, который я написал и попробовал на моем OS 10.7.3 машине, она открывает файл test, содержимое которого lol\n:

import multiprocessing 
import os 

def open_file(x): 
    with open(x, 'r') as file_obj: 
    return file_obj.readlines() 

a = multiprocessing.Pool(4) 
print a.map(open_file, ['test']*4) 

Вот результат, когда я выполняю его:

➜ ~ git:(master) ✗ python open_test.py 
[['lol\n'], ['lol\n'], ['lol\n'], ['lol\n']] 
1

В настоящее время Python не может эксплуатировать несколько ядер из-за Global Interpreter Lock. Во всяком случае, многопоточность, как правило, чревата неприятностями - лучше использовать несколько процессов, если сможете.

Смежные вопросы