tensorflow中的thread(queue以及Coordinator)的使用与控制

import tensorflow as tf
import numpy as np
import threading
import  time

# def MyLoop(coord, worker_id):
#     while not coord.should_stop():
#         if np.random.rand() * 1000 % 5 > 3:
#             print("Stopping from id : %d" % worker_id)
#             coord.request_stop()
#         else:
#             print("On id: %d" % worker_id)
#         time.sleep(1)
#
# coord = tf.train.Coordinator()
#
# threads = [threading.Thread(target=MyLoop, args=(coord, i, )) for i in range(5)]
#
# for t in threads: t.start()
#
# coord.join(threads)


#tf.QueueRunner主要用于启动多个线程来操作同一个队列,启动这些线程可以通过tf.Coordinator来进行统一管理
#定义一个tf先进先出队列,队列中最多可以有100个实数
queue = tf.FIFOQueue(100, 'float')
#这是一个入队操作
enqueue_op = queue.enqueue([tf.random_normal([1])])

#使用tf.train.QueueRunner来创建多个线程来进行这个入队操作
#其中第二个参数便表示了需要启动5个线程,每个线程运行的都是op操作
qr = tf.train.QueueRunner(queue, [enqueue_op] * 5)

#将QueueRunner加入TF计算图上制定的集合。
#若是add函数没有指定集合,那么加入默认集合tf.GraphKeys.QUEUE_RUNNERS.
tf.train.add_queue_runner(qr) #加入默认集合

out_tensor = queue.dequeue()  #这是一个出队操作

with tf.Session() as sess:
    #定义一个coord来协同已经启动的线程
    coord = tf.train.Coordinator()
    #在使用QueueRunner时,需要明确调用start_queue_runner来启动所有线程。否则因为没有线程进行入队操作,当进行出队操作时,程序就会一直等待入队操作
    #tf.train.start函数会默认启动tf.GraphKeys.QUEUE_RUNNERS集合中所有的QueueRunner。
    threads = tf.train.start_queue_runners(sess=sess, coord=coord)
    #获取队列中的值
    for _ in range(3) :
        print(sess.run(out_tensor))

    #使用coord停止线程
    coord.request_stop()
    coord.join(threads)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>