我已经启动并运行了TensorFlow群集,并且我正在尝试使用一个客户端进程将数据排入队列,并将其从另一个进程中出列。我不能让这个工作,我做错了什么?
这是推送数据的程序:
# queue_push.py
import tensorflow as tf
import time
with tf.container("qtest"):
q = tf.FIFOQueue(capacity=10, dtypes=[tf.float32],
shapes=[[]], name="q")
v = tf.placeholder(tf.float32, shape=())
enqueue = q.enqueue([v])
with tf.Session("grpc://localhost:2210") as sess:
while True:
t = time.time()
print(t)
sess.run(enqueue, feed_dict={v: t})
time.sleep(1)
我的程序来提取数据:
# queue_pull.py
import tensorflow as tf
import time
with tf.container("qtest"):
q = tf.FIFOQueue(capacity=10, dtypes=[tf.float32],
shapes=[[]], name="q")
dequeue = q.dequeue()
with tf.Session("grpc://localhost:2222") as sess:
while True:
v = sess.run(dequeue)
print("Pulled:", v)
time.sleep(0.5)
当我运行它们时,这就是我得到的:
$ python queue_push.py
1472420887.974484
1472420888.991067
1472420889.995756
1472420890.998365
1472420892.001799
1472420893.008567
1472420894.011109
1472420895.014532
1472420896.02017
1472420897.024806
1472420898.03187
(then blocked forever)
并行:
$ python queue_pull.py
(blocked forever)
答案 0 :(得分:5)
要在多个会话之间共享tf.FIFOQueue
(或其他TensorFlow队列),您需要将可选的shared_name
参数传递给constructor,并在每个会话中将其设置为相同的字符串实例。例如,您可以在两个脚本中创建q
,如下所示:
q = tf.FIFOQueue(capacity=10, dtypes=[tf.float32], shapes=[[]],
shared_name="shared_q", name="q")
shared_name
不必与队列的name
相同,但它必须在同一设备上的同一容器中创建的所有其他队列中唯一。您可以在不使用with tf.container():
块的情况下共享队列; tf.container()
块提供了一种对有状态对象进行分组的方法,以便可以有选择地清除它们(使用tf.Session.reset()
)。
N.B。 tf.Variable
个对象的默认共享行为不同,基于name
属性默认共享。否则,只有在构造函数中设置shared_name
参数时才会共享TensorFlow图中的所有共享对象(队列,读取器等)。