参考:https://blog.csdn.net/dongfeig54321/article/details/102099095?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&dist_request_id=1328626.12514.16153813394111169&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control
前文已经讲了,怎么样利用python的threading模块创建多线程并执行,这里来讲tensorflow中对线程的管理
TensorFlow提供了tf.Coordinator来管理建立的多线程
tf.Coordinator主要用于协同多个线程一起停止,并提供了should_stop、request_stop和join三个函数。
1、在启动线程之前需要声明一个tf.Coordinator类,并将这个类传入每一个创建的线程中;
2、启动的线程需要一直查询tf.Coordinatorl类中提供的should_stop函数,当这个函数的返回值为True时,则当前线程也需要退出;
每一个启动的线程都可以通过调用request_stop函数来通知其他线程是否退出。实际上,当某一个线程调用request_stop函数之后,
会影响其它线程should_stop函数的返回值,返回值将被设置为True,这样其他线程就可以同时终止。
import tensorflow as tf
import numpy as np
import threading
import time
# 线程中运行的程序,这个程序每隔1秒判断是否需要停止并打印自己的ID。
def MyLoop(coord, worker_id):
# 使用tf.Coordinator类提供的协同工具判断当前线程是否需要停止并打印自己的ID
while not coord.should_stop():
# 随机停止所有线程
if np.random.rand() < 0.1:
print('Stoping from id: %d\n' % worker_id)
# 调用coord.request_stop()函数来通知其他线程停止
coord.request_stop()
else:
# 打印当前线程的ID
print('Working on id: %d\n' % worker_id)
# 暂停1秒
time.sleep(1)
# 声明一个tf.train.Coordinator类来协同多个线程
coord = tf.train.Coordinator()
# 声明创建5个线程,将线程管理器送到线程中
threads = [threading.Thread(target=MyLoop, args=(coord, id)) for id in range(5)]
# 启动所有的线程
for t in threads: t.start()
# 等待所有线程退出
coord.join(threads)
当所有线程启动之后,每个线程会打印各自的ID,于是前面5行打印出了他们的ID。然后在暂停1秒后,所有线程又开始第二遍打印ID。这个时候有一个线程退出的条件达到,于是调用coord.request_stop函数来停止所有其他线程。在打印Stoping from id: 3之后,其他线程仍然在输出,这是因为这些线程已经执行完coord.request_stop的判断,于是仍然会继续输出自己的ID,但在下一轮将退。