线程和队列

在使用TensorFlow进行异步计算时,队列是一种强大的机制。

为了感受一下队列,让我们来看一个简单的例子。我们先创建一个“先入先出”的队列(FIFOQueue),并将其内部所有元素初始化为零。然后,我们构建一个TensorFlow图,它从队列前端取走一个元素,加上1之后,放回队列的后端。慢慢地,队列的元素的值就会增加。

TensorFlow提供了两个类来帮助多线程的实现:tf.Coordinator和 tf.QueueRunner。Coordinator类可以用来同时停止多个工作线程并且向那个在等待所有工作线程终止的程序报告异常,QueueRunner类用来协调多个工作线程同时将多个张量推入同一个队列中。

队列概述

队列,如FIFOQueue和RandomShuffleQueue,在TensorFlow的张量异步计算时都非常重要。

例如,一个典型的输入结构:是使用一个RandomShuffleQueue来作为模型训练的输入:

  • 多个线程准备训练样本,并且把这些样本推入队列。
  • 一个训练线程执行一个训练操作

同步执行队列

# 创建一个队列
Q = tf.FIFOQueue(3, dtypes=tf.float32)# 数据进队列
init = Q.enqueue_many(([0.1, 0.2, 0.3],))# 定义操作,op,出队列,+1,进队列,注意返回的都是op
out_q = Q.dequeue()
data = out_q + 1
en_q = Q.enqueue(data)with tf.Session() as sess:# 初始化队列,是数据进入
    sess.run(init)# 执行两次入队加1for i in range(2):sess.run(en_q)# 循环取队列for i in range(3):print(sess.run(Q.dequeue()))

tf.QueueRunner

QueueRunner类会创建一组线程, 这些线程可以重复的执行Enquene操作, 他们使用同一个Coordinator来处理线程同步终止。此外,一个QueueRunner会运行一个closer thread,当Coordinator收到异常报告时,这个closer thread会自动关闭队列。

您可以使用一个queue runner,来实现上述结构。 首先建立一个TensorFlow图表,这个图表使用队列来输入样本。增加处理样本并将样本推入队列中的操作。增加training操作来移除队列中的样本。

tf.Coordinator

Coordinator类用来帮助多个线程协同工作,多个线程同步终止。 其主要方法有:

  • should_stop():如果线程应该停止则返回True。
  • request_stop(): 请求该线程停止。
  • join():等待被指定的线程终止。

首先创建一个Coordinator对象,然后建立一些使用Coordinator对象的线程。这些线程通常一直循环运行,一直到should_stop()返回True时停止。 任何线程都可以决定计算什么时候应该停止。它只需要调用request_stop(),同时其他线程的should_stop()将会返回True,然后都停下来。

异步执行队列:

#主线程,不断的去取数据,开启其它线程来进行增加计数,入队
#主线程结束了,队列线程没有结束,就会抛出异常
#主线程没有结束,需要将队列线程关闭,防止主线程等待

Q = tf.FIFOQueue(1000,dtypes=tf.float32)# 定义操作
var = tf.Variable(0.0)
increment_op = tf.assign_add(var,tf.constant(1.0))
en_op = Q.enqueue(increment_op)# 创建一个队列管理器,指定线程数,执行队列的操作
qr = tf.train.QueueRunner(Q,enqueue_ops=[increment_op,en_op]*3)with tf.Session() as sess:tf.global_variables_initializer().run()# 生成一个线程协调器coord = tf.train.Coordinator()# 启动线程执行操作threads_list = qr.create_threads(sess,coord=coord,start=True)print(len(threads_list),"----------")# 主线程去取数据for i in range(20):print(sess.run(Q.dequeue()))# 请求其它线程终止
    coord.request_stop()# 关闭线程coord.join(threads_list)

转载于:https://www.cnblogs.com/fwl8888/p/9794188.html

TensorFlowIO操作(一)----线程和队列相关推荐

  1. CAS操作与无锁队列

    在多线程编程中,为了保证内存的可见性,我们加入了一些锁的机制,例如信号量,互斥锁,条件变量等等,但是锁的机制不是一个简单的机制,需要加入很多的控制,所以在使用中又有了一些轻量级的同步机制,例如vola ...

  2. 【C++ 语言】线程安全队列 ( 条件变量 | 线程调度 )

    文章目录 I . 线程简单使用 II . 互斥锁 III . 条件变量 线程同步 IV . 完整代码示例 006_ThreadSafeQueue.h 006_ThreadSafeQueue.cpp S ...

  3. python 测试 多线程 _thread和threading模块 线程同步,线程优先级队列

    文章目录 python 多线程简介 Python中使用线程的两种方式 1.函数式 示例 2.线程模块 示例 线程同步 示例 线程优先级队列( Queue)[暂时没用到,没仔细看] 示例 其他 thre ...

  4. java多线程 --ConcurrentLinkedQueue 非阻塞 线程安全队列

    ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部:当我们获取一个元素时,它会返回队列头 ...

  5. Linux C :线程操作和线程同步的多线程并发编程

    在这之前可以先看看这边文章了解线程概念,信号量,条件变量,死锁.管程等概念 https://blog.csdn.net/superSmart_Dong/article/details/11666837 ...

  6. 【Python爬虫学习笔记11】Queue线程安全队列和GIL全局解释器锁

    Queue线程安全队列 在Python多线程编程中,虽然threading模块为我们提供了Lock类和Condition类借助锁机制来处理线程并发执行,但在实际开发中使用加锁和释放锁仍是一个经常性的且 ...

  7. Linux系统编程---17(条件变量及其函数,生产者消费者条件变量模型,生产者与消费者模型(线程安全队列),条件变量优点,信号量及其主要函数,信号量与条件变量的区别,)

    条件变量 条件变量本身不是锁!但它也可以造成线程阻塞.通常与互斥锁配合使用.给多线程提供一个会合的场所. 主要应用函数: pthread_cond_init 函数 pthread_cond_destr ...

  8. TensorFlow 教程 --进阶指南--3.5线程和队列

    在使用TensorFlow进行异步计算时,队列是一种强大的机制. 正如TensorFlow中的其他组件一样,队列就是TensorFlow图中的节点.这是一种有状态的节点,就像变量一样:其他节点可以修改 ...

  9. .net 延时操作_锁、CAS操作和无锁队列的实现

    (给算法爱好者加星标,修炼编程内功) 来源:yishizuofei blog.csdn.net/yishizuofei/article/details/78353722 锁的机制 锁和人很像,有的人乐 ...

最新文章

  1. 践行科技向善,腾讯Light 把光引向厦门
  2. CIC滤波器溢出处理
  3. Day03——Python函数
  4. hdu4717 三分(散点的移动)
  5. postman测试传入json
  6. 高通QXDM抓modem log
  7. 第六章-template模板
  8. ELK+Kafka集群日志分析系统
  9. 【IT笔试面试题整理】堆栈和队列
  10. 阿里云虚拟主机安装wordpress,提示连接数据库失败的解决方法
  11. Linux课程设计:Linux系统下多进程的创建与通信
  12. 高质量程序设计指南(笔记)
  13. linux 使用team实现双网卡绑定单个IP
  14. wincc中c语言都是英文版,WINCC画面的中英文语言切换
  15. 大衣哥触底反弹,和合国际传收购孟文豪《火火的情怀》
  16. 使用python创建一个二维码生成器
  17. 洛谷 1365 WJMZBMR打osu! / Easy
  18. LeetCode 剪绳子
  19. 记:《洛克菲勒留给儿子的38封信》-- 13
  20. 微软超融合服务器,微软推出超融合系统Azure Stack HCI

热门文章

  1. 《Exchange Server 2010 SP1/SP2管理实践》一2.2 部署域名解析网络环境
  2. Rancher搭建集群
  3. 解决ubuntu软件安装依赖关系
  4. 老弟,Redis 6.0 除了多线程,别忘了这个牛逼特性!
  5. 解密初、中、高级程序员的进化之路
  6. 厉害了,教你用 Spring Boot 控制并发登录人数
  7. 高退出低留存:六年百万数据透析,想颠覆传统教育的MOOC怎么了?
  8. 我在系统设计上犯过的14个错
  9. eclipse再次导入已经逻辑删除的工程,IDE提示已存在,无法导入的解决办法
  10. Go语言TCP网络编程(详细)