2012-03-12 13 views
6

私はLinuxでPythonを開発していますが、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' 

私は、Windows 7上のPython 2.6と2.7の両方でテストだし、何度も同じエラーを取得します。誰がそれが何を意味するか知っていますか?

+1

[プラットフォーム固有のドキュメント](http://docs.python.org/library/multiprocessing.html#windows)を読んだことがありますか?特に最初の制限はありますか? –

+0

ありがとう、私はやった。私はクラス全体の引数としてリストを使用しているだけなので、酸洗エラーは起こらないようにしてください。私はProcessをサブクラス化していません。 – Blender

答えて

7

は、Windows上の制約があり、ここであなたが見ているエラーに関連する部分である:

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

もっとpicklability

Process.__init__()へのすべての引数はpickle化可能なことを確認してください。この は、特にバインドされたメソッドまたはバインドされていないメソッドをWindowsのターゲット引数として直接使用することはできません。つまり、関数 を定義して代わりに使用します。

サブクラスProcessの場合は、Process.start()メソッドが呼び出されたときに、インスタンスが のpicklableになるようにしてください。

これは、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

私はちょうどそれを読んで、ありがとう。それが何を意味するか知っていますか?私はクラス全体の引数としてリストを使用しているだけなので、酸洗エラーは起こらないようにしてください。私は 'Process'をサブクラス化していません。 – Blender

+0

私はWindowsのコマンドラインからファイルを実行しています。 'SyncManager'に関しては決して定義しませんでした。私が知る限り、それは 'マルチプロセッシング 'の一部です。 – Blender

+0

対話型コンソールでは実行できませんが、コマンドラインで 'python abc.py'と入力してスクリプトを実行するだけで問題ありません。 – Dikei

関連する問題