問題描述
我在 Linux 上使用 Python 進行開發,但從未真正見過 Windows 出現此類問題.我正在使用 multiprocessing
庫來加速計算,這對我在 Linux 上非常有效.
I develop with Python on Linux and have never really seen this sort of problem with Windows. I'm using the multiprocessing
library to speed up computations, which works very well for me on Linux.
然而,在 Windows 上,事情并不順利:
On Windows, however, things don't run as smoothly:
* [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:Python26libmultiprocessingforking.py", line 342, in main
File "C:Python26libmultiprocessingprocess.py", line 104, in start
self._popen = Popen(self)
self = load(from_parent)
File "C:Python26libmultiprocessingforking.py", line 239, in __init__
File "C:Python26libpickle.py", line 1370, in load
dump(process_obj, to_child, HIGHEST_PROTOCOL)
File "C:Python26libmultiprocessingforking.py", line 162, in dump
ForkingPickler(file, protocol).dump(obj)
File "C:Python26libpickle.py", line 224, in dump
return Unpickler(file).load()
self.save(obj)
File "C:Python26libpickle.py", line 858, in load
File "C:Python26libpickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:Python26libpickle.py", line 419, in save_reduce
dispatch[key](self)
File "C:Python26libpickle.py", line 880, in load_eof
save(state)
File "C:Python26libpickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
r aise EOFError
File "C:Python26libpickle.py", line 649, in save_dict
EOFError
self._batch_setitems(obj.iteritems())
File "C:Python26libpickle.py", line 681, in _batch_setitems
save(v)
File "C:Python26libpickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:Python26libmultiprocessingforking.py", line 40, in dispatcher
self.save_reduce(obj=obj, *rv)
File "C:Python26libpickle.py", line 401, in save_reduce
save(args)
File "C:Python26libpickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:Python26libpickle.py", line 548, in save_tuple
save(element)
File "C:Python26libpickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:Python26libpickle.py", line 419, in save_reduce
save(state)
File "C:Python26libpickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:Python26libpickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:Python26libpickle.py", line 681, in _batch_setitems
save(v)
File "C:Python26libpickle.py", line 306, in save
rv = reduce(self.proto)
File "C:Python26libmultiprocessingmanagers.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,并且一遍又一遍地遇到同樣的錯誤.有人知道是什么意思嗎?
I'm testing on both Python 2.6 and 2.7 on Windows 7 and get this same error over and over. Does anybody know what it means?
推薦答案
Windows有限制,這里是你看到的錯誤的相關部分:
There are restrictions on Windows, here is the relevant parts to the errors you are seeing:
由于 Windows 缺少 os.fork() 它有一些額外的限制:一個>
更易腌制
確保 Process.__init__()
的所有參數都是可挑選的.這尤其意味著不能使用綁定或未綁定的方法直接作為 Windows 上的目標參數 - 只需定義一個函數并改用它.
Ensure that all arguments to
Process.__init__()
are picklable. This means, in particular, that bound or unbound methods cannot be used directly as the target argument on Windows — just define a function and use that instead.
此外,如果您將 Process
子類化,請確保實例是調用 Process.start()
方法時可挑選.
Also, if you subclass Process
then make sure that instances will be
picklable when the Process.start()
method is called.
這意味著作為參數傳遞給 Process.__init__()
不能被腌制或解封(Python中的序列化).什么是 SyncManager
它抱怨無法在該對象上找到屬性 AttributeError: type object 'SyncManager' has no attribute 'from_address'
,這可能是你的根本原因.SyncManager
對象真的可以腌制嗎,是否符合pickle規則?
This means that something that is being passed as an argument to Process.__init__()
isn't able to be pickled or unpickled ( a serialization in Python ). What is SyncManager
it is complaining about not being able to find attributes on that object AttributeError: type object 'SyncManager' has no attribute 'from_address'
, it is probably your root cause. Can that SyncManager
object actually be pickled, does it meet the pickle rules?
如果您是從 Windows 上的 命令行運行它,您顯然也不能這樣做.
If you are running this from the command line on Windows, you can't do that either apparently.
不要那樣做.將代碼保存在文件中,然后使用以下命令從文件中運行它:
Don't do that. Save the code in a file and run it from the file instead, with the command:
python myfile.py
這將解決您的問題.
這篇關于Windows 上的多處理中斷的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!