博客三--tensorflow的队列及线程基本操作

数据预处理时往往涉及多个文件,所以使用多个线程对文件进行处理能够加快整体的运行速度。而线程的操作往往对队列的操作。因为文件处理可以排成队列进行操作。

下面将先上一段对队列基本操作的代码:

#!/usr/bin/env  python
# -*- coding:utf-8 -*-
#队列的基本操作  创建--初始化--出队--执行加1操作--入队--输出
import tensorflow as tf
#创建
q = tf.FIFOQueue(2, "int32")  #队列元素个数  类型
#初始化enqueue_many
init = q.enqueue_many(([0, 10],))
#出队dequeue第一个元素
x = q.dequeue()
y = x+1
#入队enqueue
q_inc = q.enqueue([y])

with tf.Session() as sess:
    init.run()   #初始化运行
    for _ in range(5):         #运行五次队列操作
        v, _ = sess.run([x, q_inc])
        print(v)

可以看到输出结果如图:fc8e9d0885f0da2ea4aeb8e0ae1ccbe7ae7.jpg

 

下面将对其的线程的基本操作,献上源码:

#!/usr/bin/env  python
# -*- coding:utf-8 -*-
#tensorflow提供的线程操作函数主要是tf.Coordinator  tf.QueueRunner;
#其中tf.Coordinator函数用法如下面代码的批注:
import tensorflow as tf
import numpy as np
import threading
import time

#线程终止判断函数   should_stop()函数返回true时停止;也可以通过request_stop通知其他线程停止,且将should_stop()置为true
def MyLoop(coord, worker_id):
    while not coord.should_stop():
        if np.random.rand() <0.1:
            print("Stoping from id : %d\n"% worker_id,)
            coord.request_stop()
        else :
            print("working on id : %d\n"%worker_id,)
        time.sleep(1)
#申明类协同多个线程
coord = tf.train.Coordinator()
#申明创建5个线程
threads = [threading.Thread(target=MyLoop, args=(coord, i, )) for i in range(5)]
#启动所有线程
for t in threads:
    t.start()
#等待所有线程退出
coord.join(threads)

书上的部分xrange(5)已被更改后运行结果如图:

7521744cfd70557370aa0a497621c905405.jpg

下面将来份多线程同时写入一个队列的操作:

#!/usr/bin/env  python
# -*- coding:utf-8 -*-
#创建五个同时执行入队操作的线程,来实现对同一个队列的操作  tf.Coordinator  tf.QueueRunner
import tensorflow as tf
#申明一个队列
queue = tf.FIFOQueue(100, "float")

#定义线程操作
enqueue_op = queue.enqueue([tf.random_normal([1])])

#创建多个同时操作的线程]
qr = tf.train.QueueRunner(queue, [enqueue_op]*5)  #操作队列名称   操作方式   线程数
#将线程加入到制定集合
tf.train.add_queue_runner(qr)

#定义出队
out_tensor = queue.dequeue()

with tf.Session() as sess:
    coord = tf.train.Coordinator() #启动线程
    threads = tf.train.start_queue_runners(sess=sess, coord=coord)   #启动数据集合上的线程
    for _ in range(3):
        print(sess.run(out_tensor)[0])

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

运行结果可以看到已经随机插入了三个数入队:

9d309a5a7c368ffa5b4908a567b0d40e0d6.jpg

哈哈哈,你学会了吗?

转载于:https://my.oschina.net/u/3770644/blog/3036960

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值