2025/8/13

Python 簡單的平行處理任務

今天來記錄一下 Python 平行程式的用法

Python 有三種方式可以平行執行程式

  1. multiprocess
  2. threading
  3. asyncio
以下分別是三種方式的範例程式碼

multiprocess


import multiprocessing
import os
import time


def compute_square(number):
    process_name = multiprocessing.current_process().name
    process_id = os.getpid()
    print(
        f"Process {process_name} (process id: {process_id}) computing square of {number}"
    )
    time.sleep(1)
    print(f"Result: {number}^2 = {number * number}")


if __name__ == "__main__":
    numbers = [2, 4, 6, 8]
    processes = []
    for num in numbers:
        p = multiprocessing.Process(target=compute_square, args=(num,))
        processes.append(p)
        p.start()
    for p in processes:
        p.join()
    print("All processes finished.")

  

threading


import os
import threading
import time


def compute_square(number):
    thread_name = threading.current_thread().name
    thread_id = threading.get_ident()
    process_id = os.getpid()
    print(
        f"Thread {thread_name} (thread id: {thread_id}, process id: {process_id}) computing square of {number}"
    )
    time.sleep(1)
    print(f"Result: {number}^2 = {number * number}")


numbers = [2, 4, 6, 8]
threads = []

for num in numbers:
    t = threading.Thread(target=compute_square, args=(num,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

print("All threads finished.")

  

asyncio


import asyncio
import os
import threading


async def compute_square(number):
    task = asyncio.current_task()
    task_id = id(task)
    thread_id = threading.get_ident()
    process_id = os.getpid()
    print(
        f"Asyncio Task (id: {task_id}) running in thread id: {thread_id}, process id: {process_id}, computing square of {number}"
    )
    await asyncio.sleep(1)
    print(f"Result: {number}^2 = {number * number}")


async def main():
    numbers = [2, 4, 6, 8]
    tasks = [compute_square(num) for num in numbers]
    await asyncio.gather(*tasks)
    print("All asyncio tasks finished.")


if __name__ == "__main__":
    asyncio.run(main())

  

從這三個範例可以看到執行的地方不同:

  1. multiprocessing 是在不同的 process 執行的。
  2. threading 是在同一個 process 的不同 thread 執行的。
  3. asyncio 是在同一個 process 的同一個 thread 執行的。

這三個範例都是簡單的執行一個單純的 task ,所以可以簡單的平行處理,如果 task 之間有順序性或是需要交換資料,都會讓平行處理的複雜度上升。

2025/8/12

Why private methods in object-oriented?

今天在思考 class 的分工時想到一個問題:為什麼 method 要分 private 跟 public?

以下是針對這個問題的一些紀錄,包含我自己的思考脈絡,跟網路上找到一些相關的資訊。

第一個想法是:如果一個 class 裡面有一大堆的 private methods 是好的嗎?

會有這個想法是因為目前工作手上的程式有一個奇怪的地方:

一個最大 class 本身帶有很多個 Handler 之類的 member(這裡一時不知道如何稱呼這種不是資料的工具類 class),很多 member 在建立的時候都會把這個 class 的實體當作 constructor 的參數帶過去給這些 class 保存,當作流程上要從這個大 class 要讀取一些資料的時候可以直接使用。

參考資料:

https://stackoverflow.com/questions/2620699/why-private-methods-in-the-object-oriented

(2025.08.10 更新)  (想不到我這麼久以前就能思考這麼難的問題)

看了參考資料裡面的討論,目前被設定成回答的選項說得很好,用 Clock 舉例讓大家可以明白 public method 跟 private method 各負責了不同的任務。

public method 就是使用者可以用的功能,private method 應該包含那些為了做到 public method 的功能,而需要做的動作,這些動作使用者不需要知道,但是卻又需要存在,這時候就可以放在 private method 。

(這樣想來,其實物理世界是全部都是 public method ,所有的細節使用者都可以操作,就算你完全不懂 Clock 的內部機制,你也可以使用 "private method" ,只是你可能會把 Clock 的狀態搞壞,導致 Clock 沒辦法提供你想要的功能 🤯)

海外馬拉松 - 青森櫻花馬拉松 2024

# 簡介

## 第二場海外馬拉松

## 賞櫻

# 青森櫻花馬拉松

## 賽道體驗、感想

---

第二場海外馬拉松

我的第一場海外馬拉松是 Mt. Fuji international Marathon 2023 富士山馬拉松 2023,比賽時間是 2023.11.26 ,這場青森櫻花馬拉松是 2024.04.21,兩場之間才差了五個月不到!為什麼這麼近呢?主要就是富士山馬拉松的體驗太棒了,跑完富士山馬拉松之後接著就跑了台北馬拉松,兩場比較之下覺得可以出國跑還是出國吧!

但是怎麼會在這麼近的時間又跑下一場呢?也只是剛好其中一位朋友在 4/20 ~ 4/25 這段期間有休假,所以就特別找了這段期間的比賽,本來是想參加另外一場「佐渡朱鷺馬拉松」,是辦在佐渡島的比賽,佐渡島算是一個「如果不是有比賽可能一輩子也不會到那裡去吧?」的地方,所以也是蠻吸引人的!

經過我研究之後,發現要到佐渡島的交通其實還蠻花時間的,加上除了跑步之外佐渡島附近比較少知名的觀光景點。在煩惱的時候呢,發現同時間其實還有一場「青森櫻花馬拉松」!發現的時候我就蠻有興趣的,因為我在 2013 (沒錯!是10年前,不是2023)的時候有到京都賞櫻過,覺得日本的櫻花季非常的漂亮,青森的交通也相對容易一些,附近也有知名的櫻花名所弘前城,所以最後我們就覺得參加「青森櫻花馬拉松」啦!

賞櫻

2013 年到日本賞櫻的時候是朋友揪的,我其實就是到現場才發現:「哇~好漂亮喔!好美喔!」完全沒有做功課。這次是自己安排當然要研究研究是怎麼回事呢?經過我研究一番之後發現,原來櫻花的花期其實很短,就是開花、滿開、吹雪也就差不多一個禮拜多,兩個禮拜不到,要可以看到櫻花真的是要有點運氣啊!

日本在一月的時候日本氣象廳就會公布今年的櫻花開花的預測,因為地球暖化的關係,每年櫻花開花的時間越來越早,如果以去年的開花日來推估的話,比賽日時可能已經快要吹雪了,雖然心中希望可以看到不同時段的櫻花,但是如果無法的話,我個人覺得吹雪是最浪漫的時刻,所以也是稍微可以接受。

幸運的是,到了三月多的時候發現今年好像沒有去年這麼冷,所以可能會比去年稍為晚開個幾天,這樣比賽日的時候櫻花就會是滿開的,然後比賽過後幾天又有吹雪可以看,真的太幸運啦!

青森櫻花馬拉松

這次青森櫻花馬拉松只報名了 21K ,因為看到青山學院也會派人參加 21K 的比賽,加上也不想太累,所以就只跑 21K 啦!原本「都特別出國了,當然要跑 42K 阿!」的想法在第二場馬拉松就已經看開了,不要太累啦!(在寫這段紀錄的時候已經是 2025.08.12 了,雖然這裡這樣說,下一場海外馬還是報了 42K,好累阿!)

比賽的前一天領物資是在終點的海邊的廣場,從青森車站走路過去還蠻OK的,附近也有物產館之類的可以去買點伴手禮。

比賽當天天氣很不錯!這場賽道基本上都是平路,只有一座橋,難度不高。櫻花開的到處都是,雖然已經有點過了滿開的時期,但是還是好浪漫啊!中間還會跑過一個公園,公園道兩側都是櫻花,好漂亮!

比賽後有很多物資可以拿,也幸運的在 2 小時內完賽,覺得是一場蠻不錯的比賽!
(隔年的天氣就很不好,還要穿雨衣跑,天氣真的影響很大阿)

完賽後的下午我們還去了弘前城賞櫻花~日本的櫻花真的是太浪漫了,有機會一定體驗看看阿!


2023/12/18

2023.12.17 台北馬拉松 - 半馬 - 1:54:05

年初訂下目標今天想要達成半馬sub2或是全馬完賽,但是其實對於要怎麼做沒什麼概念,以為只要繼續跑應該就會達到了吧,所以上半年只是繼續上RFD跑班,沒做什麼特別的調整。結果6月多的時候突然跑班停開了!

那時候只是想要維持運動習慣所以找了旻晉一對二,想不到是通往地獄的列車!每次上課都是間歇,剛開始的時候每次都操到倒地不起,到後來稍微可以到站著休息,真是不容易啊!

就這樣一直到十月開始第一場路跑:埔里馬,想不到練了這麼辛苦,埔里馬卻直接跑爆了,跑得比去年的台北馬還慢!

那時候覺得要半馬sub2達成可能有困難!還好年初的目標是半馬sub2或是全馬完賽所以還有報一場河口湖全馬。

河口湖全馬之前還有一個日月潭29k,這場就是放輕鬆跑,跑著跑著居然有跑完了。之後的河口湖全馬也是順利的跑完了。但是這兩場的配速都遠低於sub2的秒數,所以對於能不能sub2還是相當謎😯總之保底目標達成!開心🥳

會這麼沒把握的原因也是因為平常上課都只跑間歇,自己也從來沒去練過長距離(完全是自己的問題😂)還好在賽前一週終於跑了一次5k*3半馬配速,結果居然還不錯!平均配速5:24跑完了15k,預期當天只要再多撐個6k就可以了😌終於感覺有機會啦!

最後!台北馬最終成績1:54:05順利達成啦🎉

成績算是蠻滿意的,因為我路上還有去上廁所,還自己跑休了1分鐘,進補給站也休蠻久的😄

感謝旻晉教練每次都開出精準課表,差不多每次跑完都接近要倒在地板上。
感謝河吶山Leo的結構調整,每次調整完之後跑起來都更加輕鬆!
感謝老婆也是一路陪跑,而且也是有達成sub2!(平常訓練太保留實力了!)


2022/12/18

2022.12.18 台北馬紀錄 - 半馬 - 2:23:37

第一次認真跑半馬~還算在預計內(7分速)

只是從來沒跑過這麽長,結果16k之後腳踝超痛。

然後心率也沒有很高覺得不錯,基本上沒有喘的感覺,也是因為不知道自己跑這麼長之後會有什麼反應,看起來是還可以。

然後跑一跑有覺得肚子不太舒服就再慢一點,可能是太冷了!

大概就先這樣

2022/11/22

數位花園 Digital Garden 是什麼?

 

https://maggieappleton.com/garden-history

最近在研究數位花園的概念,之前看過一些中文的介紹,今天有點時間來看了一下英文的文章,第一個感受是英文的文章果然品質更好,在說明的層次上有更加提升。

我在這裡也想留下一些想法。這幾天看了數位花園的概念之後,也有在網路上看幾個自稱使用了數位花園概念建立的網站,但是呢,通常都有點年久失修,好像這種數位花園的概念就是難以長久持續下去。最常看到的花園都是剛開幕一陣子的狀態,沒有持續生長的感覺。到處都寫滿了數位花園的概念,強調這個網站是會持續成長的,可能會有錯誤,但是實際上並沒有提供真的很有意義的資訊。

又想想可能是這些網站太過於強調數位花園的定義了,不然我從我的印象中,也蠻常看到有人用部落格平台就可以達到這種「持續成長」、「沒有固定的瀏覽順序」這樣的風格。是不是其實只要替文章打上 Tag 就有機會達到隨機性瀏覽體驗?或是提供全站搜尋?在文章中提供另外一篇文章的方式難道不是在故意製造一種特定的瀏覽體驗嗎?我們以為是隨機的,但是只是選擇多無法一一計算,所以誤以為這些事情都是隨機的,只要花點時間就可以走完全部的路阿。

既然如此,回到需求的最源頭,其實還是作者想要以什麼樣的方式順序呈現資訊?或是這裡還有一個重點,其實讀者就只有作者本人,只是他剛好把這些紀錄都放在網路上而已。所以對於作者以外的讀者,真的就像是直接陷入五里霧中,完全摸不清腦袋。你必須自己費力地猜測作者到底想表達什麼?當下看到的狀態是完成呢?還是未完成?作者現在還是這樣的想法嗎?上次更新時間已經是兩年前了,難道這兩年作者都沒有新的想記錄的東西嗎?這樣還能說這裡的內容會持續成長嗎?

花園這個詞,會讓人感覺很正向。在現實中,當提到花園的時候,我們腦中可能會出現一個漂亮的花園,裡面種滿了各式各樣的植物,空氣中也充滿了植物的氣息。迫不及待的想要進到花園探索一番,期待可以在裡面看到什麼樣的景色。但是這是觀賞者的角度,今天換成園丁的角度,一定是要花費非常多的時間跟精神去照顧整個花園,只要稍微偷懶,花園中可能就會充滿各種討厭的雜草,昆蟲,令人不想靠近。

最後,我可能有空的時候會看看建立數位花園的技術,但是目前暫時維持用 Notion 寫寫紀錄吧。這只是我短短地研究後得到的一些想法,我有可能會些誤會,之後也許我也會有新的或不同的想法,那就到時候再說吧。

2022/10/31

美股指數怎麼看?

美股指數怎麼看?

  1. 道瓊工業指數
    1. ✅ 保證金交易
    2. https://zh.wikipedia.org/zh-tw/道琼斯工业平均指数
    3. 只有 30 檔,很搞笑的指數
    4. 但是看看成分股會發現,其實成分股幾乎都是有聽過的公司!
  2. 標準普爾500指數
    1. ✅ 保證金交易
    2. https://zh.wikipedia.org/wiki/S%26P_500
    3. 看維基才知道,我以為是市值最大的 500 間,結果也是選的!要選 500 間應該很累吧!
  3. 那斯達克指數
    1. ✅ 保證金交易
    2. https://zh.m.wikipedia.org/wiki/納斯達克100指數
    3. 基本上是最大的 100 間公司組成,只是計算指數的時候可能有些調整。
  4. 費城半導體指數
    1. ⛔ 保證金交易
    2. https://en.wikipedia.org/wiki/PHLX_Semiconductor_Sector
    3. 神奇的沒有中文 wiki 頁面!
    4. 看起來也是 30 檔最大的半導體公司。