1 tf.coordinator
import numpy as np
import threading
import time
import tensorflow as tf
#執行緒中執行的程式,這個程式每隔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\n' % (worker_id))
#呼叫coord.request_stop()函式來通知其他執行緒停止
coord.request_stop()
else:
#列印當前執行緒id
print ('working on id: %d\n' % (worker_id))
#暫停一秒
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)
其結果如下working on id: 1
working on id: 0
working on id: 2
working on id: 3
working on id: 4
stoping from id: 1
working on id: 0
2 tf.queuerunner
tf.queuerunner主要用於啟動多個執行緒來操作同乙個佇列,啟動的這些執行緒可以通過上訴tf.coordinator類來統一管理。下面**展示了如何利用tf.coordinator和tf.queuerunner管理多執行緒佇列:
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_runners集合。
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集合中所有queue_runners。
#因為這個函式只支援啟動指定集合中的queue_runners,所以一般來說tf.train.add_queue_runner函式與
#tf.train.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)
tensorflow 佇列與多執行緒
1 tensorflow資料輸入簡介 為了避免影象預處理成為神經網路模型訓練效率的瓶頸,tensorflow提供了多執行緒處理輸入資料的框架。流程如下 1 指定原始資料的檔案列表 2 建立檔案列表佇列 3 從檔案中讀取資料 4 資料預處理 5 整理成batch作為神經網路輸入 tensorflow中...
Tensorflow 順序佇列與IO操作
cpu負責tensorflow的計算,io負責讀取檔案 由於速度上的差異,通常做法是 主線程進行模型訓練,子執行緒讀取資料,二者通過佇列進行資料傳輸 相當於主線程從佇列讀資料,子程序往佇列放資料 在使用tensorflow進行非同步計算時,佇列是一種強大的機制。乙個簡單的例子。先建立乙個 先入先出 ...
ThreadPoolExecutor 多執行緒
from concurrent.futures import threadpoolexecutor,wait,all completed from queue import queue myqueue queue 佇列,用於儲存函式執行結果。多執行緒的問題之一 如何儲存函式執行的結果。def thr...