import tensorflow as tf # 模拟:异步子线程存入样本,主线程读取样本 # 1.定义一个队列,容量10000 q = tf.FIFOQueue(1000, tf.float32) # 2.创建一个变量,用assign_add实现自增 var1 = tf.Variable(0.0) # 第二个参数的数据类型必须跟第一个参数一致,且表示每次自增的量 data = tf.assign_add(var1, tf.constant(0.1)) # 3.入队 en_q = q.enqueue(data) # 4.定义队列管理器op,enqueue_ops指定子线程需要做的op操作,*2表示子线程的个数,TensorFlow中op是有依赖的,这边指定线程进行的en_q op它会自动去寻找data qr = tf.train.QueueRunner(q, enqueue_ops=[en_q]*2) # 5.初始化变量op init_op = tf.global_variables_initializer() with tf.Session() as sess: # 初始化变量 sess.run(init_op) # 开启线程管理器 coord = tf.train.Coordinator() # 开启子线程,start默认false,此时还需要调用thd.start()的方法去开启线程,改成true自动会开启线程 thd = qr.create_threads(sess, coord=coord, start=True) # 主线程,不断读取训练数据 for i in range(300): print(sess.run(q.dequeue())) # 回收线程,request_stop主线程完成强制停止子线程,还有一种是should_stop检查是否要求停止子线程 coord.request_stop() coord.join(thd)