首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从线程函数中获取值

从线程函数中获取值
EN

Stack Overflow用户
提问于 2022-03-18 13:32:43
回答 1查看 73关注 0票数 1

我想同时运行两个函数来检查性能,现在我一个接一个地运行,这需要相当长的时间。

这就是我跑步的方式

代码语言:javascript
复制
import pandas as pd
import threading
    
df = pd.read_csv('data/Detalhado_full.csv', sep=',', dtype={'maquina':str})

def gerar_graph_36():
    df_ordered = df.query(f'maquina=="3.6"')[['data', 'dia_semana', 'oee', 'ptg_ruins', 'prod_real_kg', 'prod_teorica_kg']].sort_values(by='data')
    oee = df_ordered['oee'].iloc[-1:].iloc[0]
    return oee

def gerar_graph_31():
    df_ordered = df.query(f'maquina=="3.1"')[['data', 'dia_semana', 'oee', 'ptg_ruins', 'prod_real_kg', 'prod_teorica_kg']].sort_values(by='data')
    oee = df_ordered['oee'].iloc[-1:].iloc[0]
    return oee

oee_36 = gerar_graph_36()
oee_31 = gerar_graph_31()

print(oee_36, oee_31)

我尝试使用以下语句应用线程,但它没有返回变量,而是打印

打印(oee_31,oee_36) ->期望: 106.3 99.7 //无返回

代码语言:javascript
复制
oee_31 = threading.Thread(target=gerar_graph_31, args=()).start()
oee_36 = threading.Thread(target=gerar_graph_36, args=()).start()
print(oee_31, oee_36)

为了检查目的,如果我使用下面的命令,按预期返回3

代码语言:javascript
复制
print(threading.active_count())

我需要函数返回的oee值,大约是103.8。

提前谢谢!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-18 13:52:39

通常,创建一个新线程并启动它与调用一个返回变量的函数不同: Thread.start()调用只是“启动另一个线程的代码”,并返回imediatelly。

要将结果合并到其他线程中,您必须使用某种数据结构将计算结果与主线程结合起来。普通的列表或字典可以做,也可以使用queue.Queue

如果您想拥有更类似于函数调用的内容,并且不能修改gerar_graph()函数,可以使用concurrent.futures module而不是线程:这是将调用包装在“未来”对象中的更高级代码,您将能够检查每个未来何时完成并获取函数返回的值。

否则,只需有一个包含列表的顶级变量,等待线程运行完毕(当"target“调用的函数返回时停止),并收集结果:

代码语言:javascript
复制
import pandas as pd
import threading
    
df = pd.read_csv('data/Detalhado_full.csv', sep=',', dtype={'maquina':str})

results = []

def gerar_graph_36():
    df_ordered = df.query(f'maquina=="3.6"')[['data', 'dia_semana', 'oee', 'ptg_ruins', 'prod_real_kg', 'prod_teorica_kg']].sort_values(by='data')
    oee = df_ordered['oee'].iloc[-1:].iloc[0]
    results.append(oee)

def gerar_graph_31():
    df_ordered = df.query(f'maquina=="3.1"')[['data', 'dia_semana', 'oee', 'ptg_ruins', 'prod_real_kg', 'prod_teorica_kg']].sort_values(by='data')
    oee = df_ordered['oee'].iloc[-1:].iloc[0]
    results.append(oee)

# We need to keep a reference to the threads themselves
# so that we can call both ".start()" (which always returns None)
# and ".join()" on them.
oee_31 = threading.Thread(target=gerar_graph_31); oee_31.start()
oee_36 = threading.Thread(target=gerar_graph_36); oee_36.start()

oee_31.join() # will block and return only when the task is done, but oee_36 will be running concurrently
oee_36.join()
print(results)

如果您需要两个以上的线程(与所有36个线程一样),我强烈建议使用concurrent.futures:您可以将工作人员的数量限制在与您所拥有的逻辑CPU相当的数量。当然,还可以在列表或字典中管理任务和调用,而不是为每个任务设置一个单独的变量名。

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

https://stackoverflow.com/questions/71527814

复制
相关文章

相似问题

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