30

multiprocessing.Queueが空の場合に発生するQueue.Empty例外をキャッチしようとしています。以下は機能しません。

import multiprocessing
f = multiprocessing.Queue()
try:
      f.get(True,0.1)
except Queue.Empty:
      print 'foo'

これにより、名前エラーが発生します:NameError:name'Queue' is not defined

Queue.Emptyをmultiprocessing.Queue.Emptyに置き換えても役に立ちません。この場合、「AttributeError:'function'オブジェクトには属性'Empty'がありません」という例外が発生します。

4

2 に答える 2

54

Empty探している例外は、モジュール(Python 2で名前が付けられていた)から借用しているため、モジュールで直接使用することはできませんmultiprocessing。コードを機能させるには、上部で次の操作を行います。multiprocessingqueueQueueimport queue

これを試して:

import multiprocessing
import queue # or Queue in Python 2

f = multiprocessing.Queue()
try:
    f.get(True,0.1)
except queue.Empty: # queue here refers to the module, not a class
    print('foo')
于 2012-12-18T21:34:59.390 に答える
21

2012年のBlckknghtの答えはまだ正しいですが、Python 3.7.1を使用すると、キャッチする例外の名前としてqueue.Emptyを使用する必要があることがわかりました(「queue」の小文字の「q」に注意してください)。

要約すると、次のようになります。

import queue

# Create a queue
queuevarname = queue.Queue(5) # size of queue is unimportant

while some_condition_is_true:
    try:
        # attempt to read queue in a way that the exception could be thrown
        queuedObject = queuevarname.get(False)

        ...
    except queue.Empty:
        # Do whatever you want here, e.g. pass so
        # your loop can continue, or exit the program, or...
于 2019-01-02T04:34:22.623 に答える