2010-02-11 27 views
6

Tôi mới dùng Python và thử một chương trình multiprocessing.pool để xử lý tệp, nó hoạt động tốt miễn là không có ngoại lệ. Nếu bất kỳ thread/quy trình được một ngoại lệ toàn bộ chương trình chờ đợi cho threadmultiprocessing Pool bị treo khi có ngoại lệ trong bất kỳ chủ đề nào

đoạn mã:

cp = ConfigParser.ConfigParser() 
cp.read(gdbini) 
for table in cp.sections(): 
    jobs.append(table) 
#print jobs 
poolreturn = pool.map(worker, jobs) 
pool.close() 
pool.join() 

Không nhắn:


Traceback (most recent call last): 
    File "/opt/cnet-python/default-2.6/lib/python2.6/threading.py", line 525, in __bootstrap_inner 
    self.run() 
    File "/opt/cnet-python/default-2.6/lib/python2.6/threading.py", line 477, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "/opt/cnet-python/default-2.6/lib/python2.6/multiprocessing/pool.py", line 259, in _handle_results 
    task = get() 
TypeError: ('__init__() takes exactly 3 arguments (2 given)', <class 'ConfigParser.NoOptionError'>, ("No option 'inputfilename' in section: 'section-1'",)) 

tôi đã tiếp tục thêm trình xử lý ngoại lệ để chấm dứt quá trình

try: 
    ifile=cp.get(table,'inputfilename') 
except ConfigParser.NoSectionError,ConfigParser.NoOptionError: 
    usage("One of Parameter not found for"+ table) 
    terminate() 

nhưng vẫn đợi, không chắc chắn những gì còn thiếu.

+0

Có vẻ như ConfigParser có cùng vấn đề với SQLAlchemy (ngoại lệ không thể chọn), xem [Hang trong kịch bản Python bằng cách sử dụng SQLAlchemy và đa xử lý] (http://stackoverflow.com/questions/8785899/hang-in-python-script -using-sqlalchemy-and-multiprocessing). Tôi đã báo cáo vấn đề này vì [Ngoại lệ ConfigParser không thể chọn được] (http://bugs.python.org/issue13760). –

Trả lời

0

Tôi gặp vấn đề tương tự. Điều này xảy ra khi một quy trình công nhân đưa ra một trường hợp ngoại lệ người dùng có một hàm tạo tùy chỉnh. Hãy chắc chắn rằng ngoại trừ của bạn (ConfigParser.NoOptionError trong trường hợp đó) khởi tạo các ngoại lệ cơ bản với chính xác hai đối số:

class NoOptionError(ValueError): 

    def __init__(self, message, *args): 
     super(NoOptionError, self).__init__(message, args) 
+1

Ngoại lệ này là từ một mô-đun Python (ConfigParser) và cần được sửa ở đó. –

2

Trong Python 3.2+ này làm việc như mong đợi. Đối với Python 2, lỗi này đã được sửa trong r74545 và sẽ có sẵn trong Python 2.7.3. Trong thời gian đó, bạn có thể sử dụng thư viện configparser, một cổng sau của trình cấu hình từ 3.2+. Check it out.

+0

Đây có phải là một phần lớn trong configparser hoặc đa xử lý? (Tôi nhận được lỗi tương tự với đa xử lý, không liên quan đến configparser) – user48956

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