スレッドとキューとキューランナーとコーディネータの関係
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)
で指定したスレッド(群)が停止するまで待機したりできる。