def pull_batch_from_queue(self):
"""
Take a rollout from the queue of the thread runner.
"""
# get top rollout from queue (FIFO)
rollout = self.runner.queue.get(timeout=600.0)
while not rollout.terminal:
try:
# Now, get remaining *available* rollouts from queue and append them into
# the same one above. If queue.Queue(5): len=5 and everything is
# superfast (not usually the case), then all 5 will be returned and
# exception is raised. In such a case, effective batch_size would become
# constants['ROLLOUT_MAXLEN'] * queue_maxlen(5). But it is almost never the
# case, i.e., collecting a rollout of length=ROLLOUT_MAXLEN takes more time
# than get(). So, there are no more available rollouts in queue usually and
# exception gets always raised. Hence, one should keep queue_maxlen = 1 ideally.
# Also note that the next rollout generation gets invoked automatically because
# its a thread which is always running using 'yield' at end of generation process.
# To conclude, effective batch_size = constants['ROLLOUT_MAXLEN']
rollout.extend(self.runner.queue.get_nowait())
except queue.Empty:
break
return rollout
评论列表
文章目录