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__()へのすべての引数が pickle 化可能であることを確認してください。これは特に、バインドされたメソッドまたはバインドされていないメソッドを Windows のターゲット引数として直接使用できないことを意味します。関数を定義して代わりに使用してください。

また、サブクラス化する場合は、メソッドが呼び出されProcessたときにインスタンスがピクル可能であることを確認してください。Process.start()

これは、 に引数として渡されたものをProcess.__init__() pickle 化または unpickle 化できないことを意味します(Python でのシリアライゼーション)。SyncManagerそのオブジェクトの属性を見つけることができないと不平を言っているのは何ですかAttributeError: type object 'SyncManager' has no attribute 'from_address'。それはおそらくあなたの根本的な原因です。そのSyncManagerオブジェクトは実際にピクルス化できますか、それはピクルスの規則を満たしていますか?

これを Windows のコマンド ラインから実行している場合は、明らかにそれもできません。

そうしないでください。コードをファイルに保存し、代わりに次のコマンドを使用してファイルから実行します。

python myfile.py

それはあなたの問題を解決します。

于 2012-03-12T16:32:53.117 に答える