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 小時內完賽,覺得是一場蠻不錯的比賽!
(隔年的天氣就很不好,還要穿雨衣跑,天氣真的影響很大阿)

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