TensorFlow佇列與多執行緒

2021-08-17 08:41:08 字數 2556 閱讀 5297

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...