首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使数据加载器(产出函数)缓冲其下一个产出

使数据加载器(产出函数)缓冲其下一个产出
EN

Stack Overflow用户
提问于 2020-01-25 00:41:14
回答 1查看 179关注 0票数 0

到目前为止,我只在functions上使用了MultiprocessingMulti-threading,并在最后return了一个结果。我知道multiprocessing.Queuemultiprocessing.Queue.get(),但我就是不明白如何将其应用于data_loader。

我为以下任务而苦苦挣扎:

代码语言:javascript
复制
def data_loader():
    for _ in range(10**6):
        #calculates for some seconds
        yield result

for data in data_loader():
    train_AI(data)
    #Here an AI is being trained for another some seconds

所以我的问题是:当AI在data_loader上训练时,有没有什么简单的方法可以让我现有的GPU计算(预缓冲)它的下一个yield

或者我必须完全重构它,使用一个外部迭代器调用一个内部较小的data_loader,每次调用它时都会returns一个批处理?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-25 07:57:52

是的,你可以使用Python的队列:

代码语言:javascript
复制
from multiprocessing import Process, Queue
from time import sleep    
FINISHED_LOADING_DATA = 'LAST ONE'  # just make sure it's not something that can be returned by some_function()

def some_function():
    print('getting data')
    sleep(0.5)
    return 'some_result'


def train_AI(x):
    print('training AI')
    sleep(2)


q = Queue()
final_results = []

def data_loader(q):
    for _ in range(10):
        result = some_function()
        q.put(result)
    q.put(FINISHED_LOADING_DATA)


def train_if_data_available():
    while True:
        data = q.get()
        if data == FINISHED_LOADING_DATA:
            return 'DONE'
        train_AI(data)


t = Process(target=data_loader, args=(q,))
t.daemon = True
t.start()

train_if_data_available()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59900553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档