首页 > Tensorflow多线程输入数据处理框架(一)——队列与多线程

Tensorflow多线程输入数据处理框架(一)——队列与多线程

参考书

《TensorFlow:实战Google深度学习框架》(第2版)

对于队列,修改队列状态的操作主要有Enqueue、EnqueueMany和Dequeue。以下程序展示了如何使用这些函数来操作一个队列。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# coding=utf-8 """
@author: Li Tian
@contact: [email protected]
@software: pycharm
@file: queue_operate.py
@time: 2019/1/31 21:32
@desc: 操作一个队列
"""import tensorflow as tf# 创建一个先进先出的队列,指定队列中最多可以保存两个元素,并指定类型为整数
q = tf.FIFOQueue(2, "int32")
# 使用enqueue_many函数来初始化队列中的元素。和变量初始化类似,在使用队列之前需要明确的调用这个初始化过程。
init = q.enqueue_many(([0, 10],))
# 使用Dequeue函数将队列中的第一个元素出队列。这个元素的值将被存在变量x中
x = q.dequeue()
# 将得到的值+1
y = x + 1
# 将+1后的值再重新加入队列。
q_inc = q.enqueue([y])with tf.Session() as sess:# 运行初始化队列的操作
    init.run()for _ in range(5):# 运行q_inc将执行数据出队列、出队的元素+1、重新加入队列的整个过程。v, _ = sess.run([x, q_inc])# 打印出队元素的取值print(v)

运行结果:



tf.Coordinator主要用于协同多个线程一起停止,以下程序展示了如何使用tf.Coordinator。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# coding=utf-8 """
@author: Li Tian
@contact: [email protected]
@software: pycharm
@file: coordinator_test1.py
@time: 2019/2/2 21:35
@desc: tf.Coordinator主要用于协同多个线程一起停止,以下程序展示了如何使用tf.Coordinator
"""import tensorflow as tf
import numpy as np
import threading
import time# 线程中运行的程序,这个程序每隔1秒判断是否需要停止并打印自己的ID。
def MyLoop(coord, worker_id):# 使用tf.Coordinator类提供的协同工具判断当前线程是否需要停止while not coord.should_stop():# 随机停止所有的线程。if np.random.rand() < 0.1:print("Stoping from id: %d
" % worker_id)# 调用coord.request_stop()函数来通知其他线程停止。
            coord.request_stop()else:# 打印当前线程的Id。print("Working on id: %d
" % worker_id)# 暂停1秒time.sleep(1)# 声明一个tf.train.Coordinator类来协同多个线程。
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)

 运行结果:



 如何使用tf.QueueRunner和tf.Coordinator来管理多线程队列操作。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# coding=utf-8 """
@author: Li Tian
@contact: [email protected]
@software: pycharm
@file: queuerunner_test1.py
@time: 2019/2/3 12:31
@desc: 如何使用tf.QueueRunner和tf.Coordinator来管理多线程队列操作。
"""import tensorflow as tf# 声明一个先进先出的队列,队列中最多100个元素,类型为实数
queue = tf.FIFOQueue(100, "float")
# 定义队列的入队操作
enqueue_op = queue.enqueue([tf.random_normal([1])])# 使用tf.train.QueueRunner来创建多个线程运行队列的入队操作。
# tf.train.QueueRunner的第一个参数给出了被操作的队列,[enqueue_op] * 5
# 表示了需要启动5个线程,每个线程中运行的是enqueue_op操作
qr = tf.train.QueueRunner(queue, [enqueue_op] * 5)# 将定义过的QueueRunner加入Tensorflow计算图上指定的集合。
# tf.train.add_queue_runner函数没有指定集合
# 则加入默认集合tf.GraphKeys.QUEUE_RUNNERS。下面的函数就是将刚刚定义的
# qr加入默认的tf.GraphKeys.QUEUE_RUNNER集合。
tf.train.add_queue_runner(qr)
# 定义出队操作
out_tensor = queue.dequeue()with tf.Session() as sess:# 使用tf.train.Coordinator来协同启动的线程。coord = tf.train.Coordinator()# 使用tf.train.QueueRunner时,需要明确调用tf.train.start_queue_runners# 来启动所有线程。否则因为没有线程运行入队操作,当调用出队操作的时候,程序会一直# 等待入队操作被运行。tf.train.start_queue_runners函数会默认启动# tf.GraphKeys.QUEUE_RUNNERS集合中所有的QueueRunner。因为这个函数值支持启动# 指定集合中的QueueRunner,所以一般来说tf.train.add_queue_runner函数和# tf.trian.start_queue_runners函数会指定同一个集合。threads = tf.train.start_queue_runners(sess=sess, coord=coord)# 获取队列中的取值。for _ in range(3):print(sess.run(out_tensor)[0])# 使用tf.train.Coordinator来停止所有的线程
    coord.request_stop()coord.join(threads)

  运行结果:

转载于:https://www.cnblogs.com/lyjun/p/10350282.html

更多相关:

  • 多线程有什么好处?提高CPU的利用率,更好地利用系统资源,使用Monitor类可以同步静态/实例化的方法的全部代码或者部分代码段,使用不同的同步类创建自己的同步机制。多线程指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程提升整体处理性能。多线程是指程序中包含多个执行流,即...

  • Step1:在界面主函数的构造函数中初始化多线程 auto mythread = new QThread(); //新建connect(mythread , &QThread::finished, mythread, &QObject::deleteLater);//线程运行结束后释放内存object1->moveToThread...

  • 一、thread的基本用法 参见C++使用thread类多线程编程 。 二、类外使用多线程,访问类的成员 这几种方式,新建线程都是在类外,然后通过把友元函数或者成员函数作为thread参数。 #include #include #include using namesp...

  • 本博文是根据中科大信息学院谭立湘老师的课件加上自己的理解整理出来的 ************************************************************************************ NVIDIA在2007年推出CUDA这个统一计算架构 CUDA的基本思想是支持大量的线程级并...

  • 一、parallel communication patterns   并行通信模式 Map:映射,在特定的位置读取和写入。 Gather:收集,从多个不同的位置读入,写入一个位置。 Scatter:分发,写入多个位置。 Transpose转置 结构数组缩写为AOS,数组结构缩写为SOA 转置运算是指任务重新排序内存中的数...

  • 使用队列实现栈的下列操作: push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空 队列的特点:先入先出 栈的特点:后入先出 即我们每次添加元素到队列时,想要达到栈的效果,则需要调整当前元素到队列头部 方法一:双队列 一个临时队列保存push进去的元素,将...

  • Queue除了前面介绍的实现外,还有一种双向的Queue实现Deque。这种队列允许在队列头和尾部进行入队出队操作,因此在功能上比Queue显然要更复杂。下图描述的是Deque的完整体系图。需要说明的是LinkedList也已经加入了Deque的一部分(LinkedList是从jdk1.2 开始就存在数据结构)。   Deque在Q...

  • 网络流量队列优先级相关知识点 Qdisc(quick disconnect)快速分离,断开;是一种排队规则,实现对流量的优先级管理.   涉及随机公平队列,令牌桶过滤器,分层令牌桶,FIFO, /*  *CopyRight (c) 2014-02-05 by Ruiy use to CopyLift!!!!  * */   ...

  • nan 是not a number ,inf是无穷大 numpy.nan_to_num(x): 使用0代替数组x中的nan元素,使用有限的数字代替inf元素...

  • 简介 Simple Reference  基础CUDA示例,适用于初学者, 反映了运用CUDA和CUDA runtime APIs的一些基本概念.Utilities Reference  演示如何查询设备能力和衡量GPU/CPU 带宽的实例程序。Graphics Reference  图形化示例展现的是 CUDA, OpenGL,...

  • 在做开发的过程中难免需要给内核及下载的一些源码打补丁,所以我们先学习下Linux下使用如如何使用diff制作补丁以及如何使用patch打补丁。...

  • 我在调研ATS 4.2.3挂载SSD的过程中,遇到很多坑,特此详细记录我摸索的主要过程,以便大家以后避免之。 基本思路可以完全照搬参考文献[2][3] 下面的安装假定是以root用户身份进行的,Linux服务器已经安装好系统,磁盘已经做好分区。 首先需要认识我们的Linux服务器的硬件配置和软件情况 硬件配置: DELL...

  • 该博文整理一些在使用stl编程过程中遇到的小经验: 1.在多线程环境下面打印调试,如何使用cout及时刷新到屏幕上? 在C中我们经常这样使用: printf("Hello World "); fflush(stdout); 如果使用stl,我们可以这样使用: cout << "Hello World" << endl <...