我有兩個要同時運行的函式來檢查性能,現在我一個接一個地運行,這需要相當長的時間。
這就是我的跑步方式
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)
我嘗試使用此陳述句應用執行緒,但它沒有回傳變數,而是列印None值
print(oee_31, oee_36) -> Expecting: 106.3 99.7 // 回傳無 無
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
print(threading.active_count())
我需要從函式回傳 oee 值,比如 103.8。
提前致謝!!
uj5u.com熱心網友回復:
通常創建一個新執行緒并啟動它不像呼叫一個回傳變數的函式:Thread.start() 呼叫只是“啟動另一個執行緒的代碼”,并立即回傳。
要在其他執行緒中收集結果,您必須使用某些資料結構將計算結果傳達給主執行緒。一個普通的串列或字典可以做,或者可以使用一個queue.Queue.
如果您想要更像函式呼叫并且不能修改gerar_graph()函式,則可以使用concurrent.futures模塊而不是執行緒:這是更高級別的代碼,它將您的呼叫包裝在“未來”物件中,您將能夠檢查每個未來何時完成并獲取函式回傳的值。
否則,只需有一個包含串列的頂級變數,等待您的執行緒完成運行(當“目標”呼叫的函式回傳時它們停止),并收集結果:
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)
如果您需要超過 2 個執行緒(如所有 36 個......),我強烈建議使用 concurrent.futures:您可以將作業執行緒的數量限制為與您擁有的邏輯 CPU 相當的數量。當然,在串列或字典中管理您的任務和呼叫,而不是為每個單獨的變數名。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/447434.html
