Python Concurrency (Part 1)
Added 2025-01-12 00:00:02 +0000 UTC呢篇文target一啲advance少少嘅讀者,如果大家已經開始用Python上手backtest,可能會令大家知道點樣improve唔同嘅範疇。
大部分algo trading嘅task其實離唔開兩樣嘢,一個就係運算,另一個係request等data返,呢度可以係交易所落盤定係第三方API數據。前者關CPU (Central Processing Unit),後者就關I/O (Input/Output operation)。下面就會講深入啲。
I/O-bound & CPU-bound

CPU-bound: 顧名思義係關CPU事,如果有啲task極度倚賴運算力,基本上就會攞入去呢個範疇,呢一類會稱之為CPU-bound task。一個典型嘅例子就係例如去計價格嘅EMA (exponential moving average)又或者係train machine learning model,又或者參數優化等等。
I/O-bound: Input/Output 意思就即係要等外部存取,例子有send一個request比交易所API,甚至係offline去開一個csv,呢啲類型嘅task就會叫做I/O-bound task。呢類型嘅task唔係好需要CPU嘅介入,主要都係由DMA (Direct Memory Access)去處理,我唔係呢方面嘅專家,而且呢度都唔想花太多時間講關於DMA。
Python: Process & Thread
前面提到大家遇到唔同task有機會受限制,CPU-bound或者I/O-bound。呢度就係講深少少,喺Python嘅層面上可以點樣減輕佢嘅限制。以下呢兩個terms會好容易混淆,而且以我理解應該係Python獨有咁樣去分,亦都係源自於本身Python嘅設計。

Process: 中文會翻譯做「進程」,其實就係指幾多個core,平時砌電腦聽到16核,32核,就係同一樣嘢。
Thread: 中文會翻譯做「線程」,Thread可以無限伸展,就好似我係咁撳好多個browser tab咁。
以前去學佢哋嘅分別嘅時候,記得讀一篇文去理解佢哋係啲咩,Process就好似一間工廠咁而Thread就好似入邊嘅工人咁。咁我哋回歸返點樣去解決CPU-bound同I/O-bound嘅問題,個解決方案就係multi-processing同multi-threading。而初學者最常寫嘅代碼其實係single process single thread,單進程單線程去行代碼。
Python Multi-processing & Multi-threading
Multi-processing: 多進程就係行多核,所以點解有時候backtest好慢,會有朋友直接好串咁叫你換機,因為假如行64核,佢可以同一組嘅時間同時去行64次同一樣嘅回測。
Multi-threading: 多線程就係解叫好多個工人去做嘢,通常可以用嚟解決I/O-bound task,最常用嘅就係我同時去唔同網站scrape data,呢啲可以係咁叫多啲thread因為本身佢哋唔係好需要運算力。
如果大家想知Python入邊點樣用到Multi-processing & Multi-threading,呢度有代碼例子,大家參考完之後可以試吓應用喺自己啲code度。首先分清楚啲pass究竟係受邊一類型限制,再去睇究竟用邊個去解決。
Comments
速度限制定係額度限制? 前者可以解決,後者唔可以用同一個IP multi thread解決。 前者如果係request一次本身都好慢,咁就係人哋server事,你自己解決唔到。
Ernie
2025-01-12 12:04:12 +0000 UTC想問如果想係同一個data source 到拎唔同data (e.g. glassnode), 但係佢本身api 有速度限制,係咪就唔可以用mutli-thearding 嘅方法去同時提取唔同數據?thanks Ernie!
Cyrus Chan
2025-01-12 11:58:04 +0000 UTC