處理商品檔資訊並在 return 後執行來加快子線程的運作
December 10, 2023
商品檔的資訊
通常券商 API 提供商品檔資訊會很豐富,但需要一直處理大量商品檔資料
而通常我們需要商品檔基本資訊,例如商品代碼與商品名稱,然後去處理其他事情
這時候就可以讓處理商品檔的線程,先回傳商品檔的基本資訊,再繼續添加商品檔資訊到商品檔中
使用 try/finally
提早 return
為了達成這個目標,就可以利用 try/finally
來實現提早回傳並繼續運算
而提早回傳可能就能觸發其他子線程開始工作,就能加快處理速度:
import threading
import time
def addData(newData):
try:
dataDict = {}
print(f'原本的字典: {dataDict}')
dataDict.update(newData)
return dataDict
finally:
def fn(dataDict):
time.sleep(1)
dataDict.update({'漲停': 700})
print(f'回傳後繼續處理 ... {dataDict}')
time.sleep(1)
dataDict.update({'跌停': 600})
print(f'回傳後繼續處理 ... {dataDict}')
threading.Thread(target=fn, args=(dataDict,)).start()
def sendOrder(data):
print(f"先取得商品代碼,立即下單 '{data['code']}'")
data = addData({'code': 2330})
sendOrder(data)
# 原本的字典: {}
# 先取得商品代碼,下單 '2330'
# 回傳後繼續處理 ... {'code': 2330, 'name': '台積電', '漲停': 700}
# 回傳後繼續處理 ... {'code': 2330, 'name': '台積電', '漲停': 700, '跌停': 600}
這就是一個範例,先將商品檔資訊回傳,其中有商品代碼就能執行其他工作
再慢慢把商品檔資訊補進去字典中,在另一個線程也能享有這些新的資訊更新
實際上可能不會在 finally
threading start,而是會把 fn
添加到 Pool 中
當然, fn
可以寫在外面,或在 sendOrder
後執行
但是這樣寫的好處在於, finally
要做的事情可以寫在 addData
中
而不會受到 addData
以外的東西影響,又能在回傳後繼續執行,甚至成為監聽器