使用多线程处理输入的数据

TensorFlow 的 Session 对象是支持多线程的,因此多个线程可以很方便地在同一个会话下对同一个队列并行地执行操作。Python 本身也提供了创建线程的threading.py,这个文件提供了Thread 类来创建线程,Thread 类的 start()函数可以用于启动线程。但是使用Python程序实现这样的并行运算没有那么简单,因为所有的线程需要能同步终止,同时需要正确察觉每个线程触发的异常。在会话终止的时候,操作队列的多个线程必须能被正确关闭。Tensorflow提供了两个类来实现多线程—train.Coordinator类和train,QueueRunner类。其中前者侧重于管理线程,用来协调同时停止多个工作线程或者在线程发生异常时向等待线程终止的程序报告异常;后者比较侧重于创建线程本身。

使用Coordinator类管理线程

Coordinator类的主要方法有should_stop()、request_stop()和join(),下面分别介绍这三个方法。should_stop():通过函数的返回值判断线程是否停止,如果线程停止了,则函数返回True。request_stop():请求该线程及其他线程停止。Join():等待被指定的线程终止。接下来,以启动 Thread 创建的线程为例来说明 Coordinator 类及其3个函数用法。在启动线程之前,需要先声明一个 Coordinator 类,并将这个类传入每一个创建的线程中。这些线程通常一直循环运行,并一直查询Coordinator 类中提供的 should_stop()函数,直到 should_stop()返回值为 True时才退出当前的线程 。每一个启动的线程也可以通知其他启动的线程退出,它只需要调用 request_stop()函数即可:同时这个线程的 should stop()函数将会返回 True ,结果是所有线程都停下来。下面是实际代码操作:
在这里插入图片描述

在上面的代码中使用Thread类创建了5个线程,无论 5 个线程中的哪一个发出,request_stop()操作请求,这 5 个线程的 should_stop()函数返回值都会输出True,并且相应的发出 request_stop()操作请求的线程也会停止。下面是输出的结果:
在这里插入图片描述

使用QueueRunner创建线程

QueueRunner类主要用于替代Python自身的Thread类创建多个线程。但是需要注意的地方是,QueueRunner类必须配合Coordinator类一起使用。正确的操作流程是先使用QueueRunner类创建多个线程来操作同一个队列,这些线程会通过train,add_queue_runner()函数加入一个集合中,之后再调用train.start_queue_runners()函数来启动所有线程并通过参数来管理这些线程的Coordinator类。train.add_queue_runner()函数中如果没有指定自己的集合,那么这些线程会被加入到计算图默认的一个集合中(这里就不再赘述,只要了解就可以)。需要注意的是,这个函数只支持启动指定集合中的 QueueRnner,所以需要先将线程放入集合中。 一般的做法是把train.add_queue_runner()函数指定的集合与 train. start_queue_runner()函数指定的集合保持一致。 以下是操作代码:

在这里插入图片描述
上面的代码中,我们首先定义了一个队列,以及一个入队操作,之后通过QueueRunner类创建了5个线程来执行这个入队操作,调用start_queue_runners()函数来运行线程,最后打印出结果。如下图所示:

在这里插入图片描述
总结:本节有关使用多线程处理输入的数据的内容就到这里了,如果有没有看明白的可以实际上手操作一下,这样会更有利于理解消化。

关注小鲸融创,一起深度学习金融科技!

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值