Встроенная многопроцессорная обработка Python. IOError: [Errno 22] Неверный аргумент

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

Итак, я запустил отладчик, и он также не обнаружил ошибок с многопоточным кодом, что кажется немного странным. Но когда я пытаюсь запустить скрипт как обычно, он печатает под 3.2.3:

Python 3.2.3 (default, Apr 11 2012, 07:12:16) [MSC v.1500 64 bit (AMD64)]
Type "help", "copyright", "credits" or "license" for more information.
[evaluate scratch.py]
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Python32\Lib\multiprocessing\forking.py", line 369, in main
    self = load(from_parent)
AttributeError: 'module' object has no attribute 'search_letters_in_words'
Traceback (most recent call last):
  File "C:\Program Files (x86)\Wing IDE 4.1\src\debug\tserver\_sandbox.py", line 122, in <module>
  File "C:\Python32\Lib\multiprocessing\process.py", line 132, in start
    self._popen = Popen(self)
  File "C:\Python32\Lib\multiprocessing\forking.py", line 269, in __init__
    to_child.close()
builtins.IOError: [Errno 22] Invalid argument

Редактировать: я переключился на 3.3, чтобы посмотреть, что происходит, и он непоследовательно постоянно выдает одну из этих двух трассировок:

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)]
Type "help", "copyright", "credits" or "license" for more information.
[evaluate scratch.py]
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Python33\Lib\multiprocessing\forking.py", line 344, in main
    self = load(from_parent)
AttributeError: 'module' object has no attribute 'search_letters_in_words'
Traceback (most recent call last):
  File "C:\Program Files (x86)\Wing IDE 4.1\src\debug\tserver\_sandbox.py", line 122, in <module>
  File "C:\Python33\Lib\multiprocessing\process.py", line 111, in start
    self._popen = Popen(self)
  File "C:\Python33\Lib\multiprocessing\forking.py", line 243, in __init__
    dump(process_obj, to_child, HIGHEST_PROTOCOL)
  File "C:\Python33\Lib\multiprocessing\forking.py", line 160, in dump
    ForkingPickler(file, protocol).dump(obj)
builtins.BrokenPipeError: [Errno 32] Broken pipe

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)]
Type "help", "copyright", "credits" or "license" for more information.
[evaluate scratch.py]
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Python33\Lib\multiprocessing\forking.py", line 344, in main
    self = load(from_parent)
AttributeError: 'module' object has no attribute 'search_letters_in_words'

Редактировать #2 Добавлена ​​трассировка при вызове из командной строки:

D:\Python\PythonRepo>scratch.py > d:\download\error.txt
Traceback (most recent call last):
  File "D:\Python\PythonRepo\scratch.py", line 122, in <module>
    thread.start()
  File "C:\Python32\Lib\multiprocessing\process.py", line 131, in start
    from .forking import Popen
  File "C:\Python32\Lib\multiprocessing\forking.py", line 180, in <module>
    import _subprocess
ImportError: No module named '_subprocess'

Вот код многопроцессорной обработки, который я написал до сих пор. Это может быть (ха, кого я шучу, наверное, так и есть!) глючит, но я не уверен, что не так, потому что это выглядит правильно (не так ли всегда?).

wordList = pickle.load( open( r'd:\download\allwords.pickle', 'rb')) #a list
combos = make_letter_combinations(3) # a list
split = split_list_multi(combos) #2 item tuple with a dict and a number
if __name__ == '__main__':
    multiprocessing.freeze_support()
    jobs = []
    for num in range(split[1]):
        listLetters = split[0][str(num)] #a list
        thread = multiprocessing.Process(target=search_letters_in_words, args=(listLetters,wordList))
        jobs.append(thread)
        thread.start()
    for j in jobs:
        j.join()

Изменить: вот функция search_letters_in_words_:

def search_letters_in_words(listOfLetters,wordlist):
    results = {}
    for letters in listOfLetters:
        results[letters] = [i for i in wordlist if letters in i]
    return results

Если кто-то может указать, что я делаю неправильно, я был бы признателен!


person Jason White    schedule 11.02.2013    source источник


Ответы (2)


Попробуйте запустить скрипт из командной строки, а не через Wing IDE:

python scripy.py
person unutbu    schedule 11.02.2013
comment
Привет, unutbu, на самом деле это функция, которая работает нормально, за исключением случаев, когда я пытаюсь выполнить многопоточный скрипт, что меня смущает. - person Jason White; 12.02.2013
comment
Попробуйте запустить скрипт из терминала, а не из WingIDE. Я не знаком с Windows (или WingIDE), но знаю, что в Windows многопроцессорный модуль повторно импортирует сценарий для эмуляции Unix os.fork. Я не уверен, хорошо ли это работает внутри WingIDE. Хотя, возможно, он работает нормально. Я просто не знаю. - person unutbu; 12.02.2013
comment
Кстати, похоже, вы используете многопроцессорность для запуска функций в подпроцессах. Это отличается от создания многопоточного сценария. Потоки отличаются от процессов. - person unutbu; 12.02.2013
comment
Я погуглил, и мне показалось, что для того, чтобы python использовал более одного ядра для параллельной обработки, я должен использовать многопроцессорность, поскольку многопоточность не гарантирует, что python будет использовать все ядра. Или что-то в этом роде. Я, вероятно, не должен использовать многопроцессорность и многопоточность взаимозаменяемо. Я запустил скрипт из командной строки, которую добавил в пост. - person Jason White; 12.02.2013
comment
Ваша проблема (AttributeError: 'module' object has no attribute ...) очень похожа на этот вопрос SO. - person unutbu; 12.02.2013
comment
Ахха, эта ссылка решила это! Когда вы сказали мне попробовать из командной строки, я забыл ввести python script.py, хех. Забыл об этой команде, так как обычно я просто запускаю их из ide. Спасибо! - person Jason White; 12.02.2013

Я получал код ошибки по другой причине (с Py 3 и Win 7). Чтение имени файла из файла .ini с кавычками сломало файл, открытый для функции csv.DictWriter. Удаление "" исправило это:

...
[CSVFILE]
#CfgCsvNamePattern="C:\\temp\\PenSim-%%s.csv"
CfgCsvNamePattern=C:/temp/PenSim%%s.csv
...
person fortradon    schedule 19.12.2013