2012-03-12 3 views
6

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

В 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

Вы прочитали [документацию на платформе] (http://docs.python.org/library/multiprocessing.html#windows), особенно первое ограничение? –

+0

Спасибо, я просто сделал. Я использую только списки в качестве аргументов для всего класса, поэтому ошибок травления не должно быть. Я тоже не подклассифицирую процесс. – Blender

ответ

7

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

Since Windows lacks os.fork() it has a few extra restrictions:

Больше picklability

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

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

Это означает, что что-то, что в настоящее время передается в качестве аргумента Process.__init__()isn't able to be pickled or unpickled (сериализации в Python). Что такое SyncManager, он жалуется, что не смог найти атрибуты на этом объекте AttributeError: type object 'SyncManager' has no attribute 'from_address', это, вероятно, ваша основная причина. Может ли это SyncManager объект фактически быть маринован, does it meet the pickle rules?

Если вы используете это из command line on Windows, you can't do that либо, очевидно.

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

python myfile.py 

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

+0

Я только что прочитал это, спасибо. Вы знаете, что это значит? Я использую только списки в качестве аргументов для всего класса, поэтому ошибок травления не должно быть. Я тоже не подклассифицирую «Процесс». – Blender

+0

Я запускаю файл через командную строку Windows. Что касается 'SyncManager', я никогда не определял его. Насколько я могу судить, это часть «многопроцессорности». – Blender

+0

Вы не можете запустить его в интерактивной консоли, но запуск скрипта путем ввода 'python abc.py' в командной строке работает отлично. – Dikei

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