2012-03-12 28 views
6

Tôi phát triển bằng Python trên Linux và chưa bao giờ thực sự thấy vấn đề này với Windows. Tôi đang sử dụng thư viện multiprocessing để tăng tốc độ tính toán, hoạt động rất tốt cho tôi trên Linux.Đa xử lý trên các lần ngắt Windows

Trên Windows, tuy nhiên, mọi thứ không chạy như suôn sẻ:

* [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' 

Tôi đang thử nghiệm trên cả hai Python 2.6 và 2.7 trên Windows 7 và nhận được lỗi này lặp đi lặp. Có ai biết nó có ý nghĩa gì không?

+1

Bạn đã đọc [tài liệu dành riêng cho nền tảng] (http://docs.python.org/library/multiprocessing.html#windows), đặc biệt là hạn chế đầu tiên? –

+0

Cảm ơn, tôi đã làm. Tôi chỉ sử dụng danh sách làm đối số cho cả lớp, vì vậy không nên có bất kỳ lỗi tẩy. Tôi cũng không phân lớp quá trình. – Blender

Trả lời

7

Có những hạn chế trên Windows, đây là những phần liên quan đến các lỗi bạn đang nhìn thấy:

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

More picklability

Đảm bảo rằng tất cả các đối số cho Process.__init__() là picklable. Điều này có nghĩa là, cụ thể là các phương thức ràng buộc hoặc không ràng buộc không thể được sử dụng trực tiếp như đối số đích trên Windows - chỉ cần xác định hàm và sử dụng phương thức đó thay thế.

Ngoài ra, nếu bạn phân lớp Process thì hãy đảm bảo rằng các phiên bản sẽ là có thể chọn khi phương thức Process.start() được gọi.

Điều này có nghĩa là một thứ gì đó đang được chuyển làm đối số cho Process.__init__()isn't able to be pickled or unpickled (tuần tự hóa bằng Python). Điều gì là SyncManager nó phàn nàn về việc không thể tìm thấy các thuộc tính trên đối tượng đó AttributeError: type object 'SyncManager' has no attribute 'from_address', nó có thể là nguyên nhân gốc rễ của bạn. Liệu đối tượng SyncManager có thực sự được chọn, does it meet the pickle rules không?

Nếu bạn đang chạy điều này từ command line on Windows, you can't do that hoặc là hiển nhiên.

Đừng làm điều đó. Lưu mã trong tệp và chạy tệp từ tệp thay thế bằng lệnh:

python myfile.py 

Điều đó sẽ giải quyết được vấn đề của bạn.

+0

Tôi chỉ đọc điều đó, cảm ơn. Bạn có biết ý nghĩa của nó? Tôi chỉ sử dụng danh sách làm đối số cho cả lớp, vì vậy không nên có bất kỳ lỗi tẩy. Tôi cũng không phân lớp 'Process'. – Blender

+0

Tôi đang chạy tệp qua dòng lệnh của Windows. Đối với 'SyncManager', tôi chưa bao giờ định nghĩa nó. Đó là một phần của 'đa xử lý 'theo như tôi có thể nói. – Blender

+0

Bạn không thể chạy nó trong giao diện điều khiển tương tác, nhưng chạy kịch bản bằng cách gõ 'python abc.py' trong dòng lệnh hoạt động tốt. – Dikei