[異步、tensorflow] - 子線程操作tensor,主線程處理tensor

  • 參考
  • 整體流程如下圖
    在這裏插入圖片描述
  • 代碼
import  tensorflow as tf

"""
    模擬: 子線程不停的取數據放入隊列中, 主線程從隊列中取數據執行
    包含: 作用域的命名、把程序的圖結構寫入事件、多線程
"""

# 模擬異步存入樣本.
# 1、 定義一個隊列,長度爲1000
with tf.variable_scope("init_sub_threads"):
    Q = tf.FIFOQueue(1000, tf.float32)

# 2、 定義子線程需要做的事情, 值循環+1, 放入隊列中
with tf.variable_scope("add_one"):
    var = tf.Variable(0.0, tf.float32)

    # 實現自增
    data = tf.assign_add(var, tf.constant(1.0))

    en_q = Q.enqueue(data)

# 3、 定義隊列管理器Op,指定子線程
with tf.variable_scope("init_queue_runner"):
    qr = tf.train.QueueRunner(Q, enqueue_ops=[en_q] * 2)

# 初始化變量的op
with tf.variable_scope("init_var"):
    init_op = tf.global_variables_initializer()

with  tf.Session() as sess:
    # 初始化變量
    sess.run(init_op)

    # 開啓線程管理器
    coord = tf.train.Coordinator()

    # 真正開啓子線程
    threads = qr.create_threads(sess, start = True)

    # 主線程,不斷讀取數據訓練
    for i in range(300):
        print(sess.run(Q.dequeue()))

    # 把程序的圖結構寫入事件
    filewriter = tf.summary.FileWriter("./summary/", graph=sess.graph)

    # 回收線程
    coord.request_stop()

    coord.join(threads)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章