2011-06-27 42 views
13

Vì một số lý do tôi không thể truy cập ngoại lệ Queue.Empty - tôi đang làm gì sai ở đây?Không thể truy cập Queue.Empty: đối tượng "AttributeError: 'function' không có thuộc tính 'Empty'"

from multiprocessing import Process, Queue 

# ... 

try: 
    action = action_queue.get(False) 
    print "Action: " + action 
except Queue.Empty: 
    pass 

Các stack trace:

Traceback (most recent call last): 
File "C:\Program Files\Python27\lib\multiprocessing\process.py", line 258, 
    in _bootstrap 
    self.run() 
File "C:\Program Files\Python27\lib\multiprocessing\process.py", line 114, 
    in run 
    self._target(*self._args, **self._kwargs) 
File "D:\Development\populate.py", line 39, in permutate 
    except Queue.Empty: AttributeError: 'function' object has no attribute 'Empty' 

Trả lời

25

Các Queue.Empty ngoại lệ là trong module Queue, không phải trong lớp multiprocessing.queues.Queue. Các module đa thực sự sử dụng Queue (mô-đun) rỗng ngoại trừ lớp:

from multiprocessing import Queue 
from Queue import Empty 
q = Queue() 
try: 
    q.get(False) 
except Empty: 
    print "Queue was empty" 

Nếu bạn muốn trở thành rất rõ ràng và chi tiết, bạn có thể làm điều này:

import multiprocessing 
import Queue 
q = multiprocessing.Queue() 
try: 
    q.get(False) 
execpt Queue.Empty: 
    print "Queue was empty" 

ưu các phương pháp cũ có lẽ là một ý tưởng tốt hơn bởi vì chỉ có một đối tượng Queue lo lắng và bạn không cần phải băn khoăn liệu bạn có đang làm việc với class hay module như trong ví dụ thứ hai của tôi hay không.

+0

Ah tôi thấy bây giờ, tôi nghĩ rằng nhập hàng đợi nhập khẩu mô-đun, chứ không phải là lớp. Cảm ơn! – Ross

+1

thậm chí còn thú vị hơn - việc nhập khẩu 'từ việc xử lý hàng đợi nhập khẩu đa' nhập hàm Queue từ' __init __. Py' trong phép đa xử lý trả về lớp Queue từ mô đun phụ multiprocessing.queues. Cách gõ vịt và không gian tên giúp lập trình thú vị! – underrun

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