Многопроцессорность в Windows ломается

Я разрабатываю Python на Linux и никогда не видел таких проблем с Windows. Я использую библиотеку multiprocessing для ускорения вычислений, которая очень хорошо работает для меня в Linux.

Однако в Windows все идет не так гладко:

 * [INFO] Parsing 1 file using 2 threads

Traceback (most recent call last):
  File "main.py", line 170, in <module>
    master = ParsingMaster(parser, list(input_file), output_list, threads=num_threads)
Traceback (most recent call last):
  File "main.py", line 39, in __init__
  File "<string>", line 1, in <module>
    self.input_process.start()
  File "C:\Python26\lib\multiprocessing\forking.py", line 342, in main
  File "C:\Python26\lib\multiprocessing\process.py", line 104, in start
        self._popen = Popen(self)
self = load(from_parent)
  File "C:\Python26\lib\multiprocessing\forking.py", line 239, in __init__
  File "C:\Python26\lib\pickle.py", line 1370, in load
    dump(process_obj, to_child, HIGHEST_PROTOCOL)
  File "C:\Python26\lib\multiprocessing\forking.py", line 162, in dump
    ForkingPickler(file, protocol).dump(obj)
  File "C:\Python26\lib\pickle.py", line 224, in dump
    return Unpickler(file).load()
    self.save(obj)
 File "C:\Python26\lib\pickle.py", line 858, in load
  File "C:\Python26\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Python26\lib\pickle.py", line 419, in save_reduce
    dispatch[key](self)
  File "C:\Python26\lib\pickle.py", line 880, in load_eof
    save(state)
  File "C:\Python26\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
    r aise EOFError
 File "C:\Python26\lib\pickle.py", line 649, in save_dict
EOFError
    self._batch_setitems(obj.iteritems())
  File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems
    save(v)
  File "C:\Python26\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python26\lib\multiprocessing\forking.py", line 40, in dispatcher
    self.save_reduce(obj=obj, *rv)
  File "C:\Python26\lib\pickle.py", line 401, in save_reduce
    save(args)
  File "C:\Python26\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python26\lib\pickle.py", line 548, in save_tuple
    save(element)
  File "C:\Python26\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Python26\lib\pickle.py", line 419, in save_reduce
    save(state)
  File "C:\Python26\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python26\lib\pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems
    save(v)
  File "C:\Python26\lib\pickle.py", line 306, in save
    rv = reduce(self.proto)
  File "C:\Python26\lib\multiprocessing\managers.py", line 458, in __reduce__
    return type(self).from_address, \
AttributeError: type object 'SyncManager' has no attribute 'from_address'

Я тестирую Python 2.6 и 2.7 в Windows 7 и снова и снова получаю одну и ту же ошибку. Кто-нибудь знает, что это значит?


person Blender    schedule 12.03.2012    source источник
comment
Вы читали документацию по платформе, особенно первое ограничение?   -  person Sven Marnach    schedule 12.03.2012
comment
Спасибо, я только что сделал. Я использую только списки в качестве аргументов для всего класса, поэтому ошибок травления быть не должно. Я также не создаю подклассы Process.   -  person Blender    schedule 12.03.2012


Ответы (1)


В Windows есть ограничения, вот соответствующие части ошибок, которые вы видите:

Поскольку в Windows отсутствует функция os.fork(), у нее есть несколько дополнительных ограничений:

Больше травления

Убедитесь, что все аргументы Process.__init__() доступны для выбора. Это означает, в частности, что связанные или несвязанные методы нельзя использовать напрямую в качестве целевого аргумента в Windows — просто определите функцию и используйте ее вместо этого.

Кроме того, если вы создаете подкласс Process, убедитесь, что экземпляры будут доступны для выбора при вызове метода Process.start().

Это означает, что что-то, что передается в качестве аргумента Process.__init__() , не может быть обработано или удалено. (сериализация в Python). Что такое SyncManager, он жалуется на то, что не может найти атрибуты для этого объекта AttributeError: type object 'SyncManager' has no attribute 'from_address', вероятно, это ваша основная причина. Может ли этот SyncManager объект действительно быть замаринован, делает это соответствовать правилам рассола?

Если вы запускаете это из командной строки в Windows, вы не можете сделать это либо очевидно.

Не делай этого. Сохраните код в файле и запустите его из файла с помощью команды:

python myfile.py

Это решит вашу проблему.

person Community    schedule 12.03.2012
comment
Я только что прочитал это, спасибо. Вы знаете, что это значит? Я использую только списки в качестве аргументов для всего класса, поэтому ошибок травления быть не должно. Я тоже не создаю подкласс Process. - person Blender; 12.03.2012
comment
Я запускаю файл через командную строку Windows. Что касается SyncManager, я никогда не определял его. Насколько я могу судить, это часть multiprocessing. - person Blender; 12.03.2012
comment
Вы не можете запустить его в интерактивной консоли, но запуск скрипта путем ввода python abc.py в командной строке работает нормально. - person Kien Truong; 12.03.2012
comment
Это то, что я имел в виду. Я запускаю его через C:\Python26\python.exe script.py. - person Blender; 12.03.2012
comment
вы спасли меня от большого количества дерьма: D Спасибо. Я менял IDE, и казалось, что ничего не имеет смысла. - person vlad-ardelean; 21.04.2013
comment
связанные или несвязанные методы нельзя использовать напрямую в качестве целевого аргумента в Windows — просто определите функцию и используйте ее вместо этого. ничего себе, это становится грубым, если вы пытаетесь перенести что-то, что не учитывало это при определении архитектуры. - person Ezekiel Kruglick; 17.09.2015