處理商品檔資訊並在 return 後執行來加快子線程的運作

December 10, 2023

img

商品檔的資訊

通常券商 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 以外的東西影響,又能在回傳後繼續執行,甚至成為監聽器


Tags: threading trading python