asyncioの\のqueues.pyasyncio.Queue.putを除いて間違っていますか?私の見解では
@coroutine
def put(self, item):
"""Put an item into the queue.
Put an item into the queue. If the queue is full, wait until a free
slot is available before adding item.
This method is a coroutine.
"""
while self.full():
putter = futures.Future(loop=self._loop)
self._putters.append(putter)
try:
yield from putter
except:
putter.cancel() # Just in case putter is not done yet.
if not self.full() and not putter.cancelled():
# We were woken up by get_nowait(), but can't take
# the call. Wake up the next in line.
self._wakeup_next(self._putters)
raise
return self.put_nowait(item)
、putter
はcancel
、set_exception
またはset_result
によって行うことができます。 get_nowait
set_result
を使用してください。 cancel
とset_exception
のみが例外をスローすると、except:
が発生する可能性があります。私はexcept:
は必要ないと思う。
なぜexcept:
〜Wake up the next in line
が追加されますか?
更新: @Vincent _wakeup_next
コールset_result
。 set_result
はself._state = _FINISHED
を実行します。 task1.cancel()
self._fut_waiter.cancel()
はFalseを返します。したがって、task1はをキャンセルしていないになります。
@Vincentおかげで非常に多くの
キー原因は、タスクが待っている未来はset_resultメソッドしたがtask.cancelは(self._state = _FINISHED)タスクをキャンセルすることができます。
_wakeup_next呼び出しset_result。 set_resultは 'self._state = _FINISHED'を実行します。 task1.cancel()は 'self._fut_waiter.cancel()'を返し、Falseを返します。 – Vince
@Vince 'task1'と' putter'は同じ未来ではありません。パター( 'task1._fut_waiter')は実際に終了しますが、' task1'は取り消され、 'task1._must_cancel'が' True'にセットされるまで、そうではありません。 – Vincent
この場合、task1はtask1.cancelのときに保留中(開始されていない)なので、開始する前にキャンセルされます。 get_nowaitはパターを起動させません(ただし、task1はトリガーされません)。たぶん、実行中のタスクを取り消すサンプルを作成する必要があります1。 – Vince