2010-05-06 17 views
53

Tôi biết điều này đã được trả lời trước đó, nhưng có vẻ như việc thực thi tập lệnh trực tiếp "python filename.py" không hoạt động. Tôi có Python 2.6.2 trên SuSE Linux.một sự nhầm lẫn khác với lỗi đa xử lý, đối tượng 'mô-đun' không có thuộc tính 'f'

Code:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
from multiprocessing import Pool 
p = Pool(1) 
def f(x): 
    return x*x 
p.map(f, [1, 2, 3]) 

dòng lệnh:

> python example.py 
Process PoolWorker-1: 
Traceback (most recent call last): 
File "/usr/lib/python2.6/multiprocessing/process.py", line 231, in _bootstrap 
    self.run() 
File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in run 
    self._target(*self._args, **self._kwargs) 
File "/usr/lib/python2.6/multiprocessing/pool.py", line 57, in worker 
    task = get() 
File "/usr/lib/python2.6/multiprocessing/queues.py", line 339, in get 
    return recv() 
AttributeError: 'module' object has no attribute 'f' 
+1

thể trùng lặp của [Sử dụng python đa xử bể bơi tại nhà ga và trong moudles mã cho Django hoặc Flask] (http://stackoverflow.com/questions/18947876/using-python-multiprocessing-pool -in-the-thiết bị đầu cuối-và-trong-mã-moudles-cho-django) –

+0

@jb. bài đăng đó muộn hơn năm 2010, đây là năm 2010, đó là năm 2013 – gatoatigrado

+2

Độ tuổi không được chấp nhận có sự đồng thuận về meta câu hỏi có câu trả lời tốt hơn nên được chọn và một câu trả lời khác có IMO câu trả lời tốt hơn. –

Trả lời

98

Tái cơ cấu mã của bạn để hàm f() được xác định trước khi bạn tạo phiên bản của Hồ bơi. Nếu không, nhân viên không thể thấy chức năng của bạn.

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

from multiprocessing import Pool 

def f(x): 
    return x*x 

p = Pool(1) 
p.map(f, [1, 2, 3]) 
+3

tuyệt vời, cảm ơn bạn rất nhiều !! Sử dụng bí ẩn! – gatoatigrado

+1

LƯU Ý: Một vài năm sau, tôi đã bắt đầu viết một thay thế imap [https://github.com/gatoatigrado/vimap], làm cho sai lầm này khó khăn hơn (và làm cho nó rõ ràng khi chủ đề được chia hai). – gatoatigrado

+1

@Bartosz, Bạn có biết tại sao đây không phải là vấn đề trong sổ ghi chép ipython không? – Framester

4

Cái này hoạt động:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
from multiprocessing import Pool 

def f(x): 
    return x*x 

if __name__ == "__main__": 
    p = Pool(1) 
    p.map(f, [1, 2, 3]) 

Tôi không chắc chắn 100% tại sao mã của bạn không làm việc, nhưng tôi đoán lý do là các tiến trình con được đưa ra bởi mô-đun multiprocessing cố gắng nhập mô-đun chính (để có quyền truy cập vào các phương thức bạn đã xác định) và yêu cầu không cần phải thực thi mã khởi tạo if __name__ == "__main__" để thiết lập hồ bơi của bạn.

+0

Nếu người ta phải chạy mã như vậy thông qua một thông dịch viên trên Windows thì có công việc nào không? Đây là tình huống mà tôi đang phải đối mặt khi thực hiện một số chương trình Python-Fu từ trình cắm thêm Gimp Python Console. – jxramos

+0

Điều này đã không làm việc cho tôi –

1

Một khả năng là file python của bạn có cùng tên với một mô-đun:

  • test.py
  • thử nghiệm/
    • __init__.py

trong pickle.py, bạn gặp lỗi g từ:

def find_class(self, module, name): 
     # Subclasses may override this 
     __import__(module) 
     mod = sys.modules[module] # <- here mod will reference your test/__init__.py 
     klass = getattr(mod, name) 
     return klass 
0

Vấn đề tôi đã được giải quyết bằng cách sử dụng if __name__ == "__main__" như được chỉ ra bởi Tamás; trong Eclipse cho Windows, các ví dụ không hoạt động dưới trình thông dịch. này được giải thích trong http://docs.python.org/2/library/multiprocessing

Các vấn đề liên quan