スレッドとキューとキューランナーとコーディネータの関係

TensorflowのDeveloper’s Guideのスレッドとキュー解説をかいつまんでまとめてみる。

Threading and Queues  |  TensorFlow

  • キュー

文字通り、データのキュー。FIFOQueueなど。 q = tf.FIFOQueue(3, "float") として定義した後、 x = q.dequeue()でデータのポップ、 q_inc = q.enqueue([y]) でデータのプッシュができる

  • キューランナー

キューに対して、繰り返し同じ操作でenqueueオペレーションを実行するスレッドを指定数だけ作成する

queue = tf.RandomShuffleQueue(...)
enqueue_op = queue.enqueue(example)
qr = tf.train.QueueRunner(queue, [enqueue_op] * 4)
sess = tf.Session()
coord = tf.train.Coordinator()
enqueue_threads = qr.create_threads(sess, coord=coord, start=True)

上記のコードで、queueに対して、exampleという操作(op)でエンキューを行うスレッドを4つ作成していることになる。 注意点は、あくまでエンキューを行うスレッドであるということ。 また、キューランナーでスレッドを作成するときには、そのスレッドたちの「監督役」になるCoordinaorを指定する必要がある。

  • コーディネータ

前述のキューランナーでスレッドを作成する際に、スレッドの監督役になるオブジェクト。 coord = tf.train.Coordinator() で作成したあとキューランナーに渡すと、 coord.should_stop()でスレッドを殺すべきタイミングを教えてくれたり、 coord.request_stop()でスレッドの停止を命令したり coord.join(threads)で指定したスレッド(群)が停止するまで待機したりできる。