Многопроцессорность на перерывах Windows - PullRequest
8 голосов
/ 12 марта 2012

Я занимаюсь разработкой с 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 и получаю эту ошибку снова и снова. Кто-нибудь знает, что это значит?

1 Ответ

10 голосов
/ 12 марта 2012

Есть ограничения для 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

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

...