10

我在 Linux 上使用 Python 进行开发,但从未真正遇到过 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'

我正在 Windows 7 上同时测试 Python 2.6 和 2.7,并一遍又一遍地得到同样的错误。有人知道这是什么意思吗?

4

1 回答 1

11

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

这将解决您的问题。

于 2012-03-12T16:32:53.117 回答