跳到主要內容

[Python] threading 範例

總算把程式碼弄了一個段落,還是想要破解之前一直搞不懂的 threading 多線程物件到底要怎麼用,剛好看到 youtube 的教學 " 学会多线程 python threading教学 学习教程 "

教學簡單明瞭,但是我個人覺得在概念與整體架構的介紹詳細程度上不是很完善,主打快速上使用吧,總之我是看了XD,然後自己練習了一下。

其實有範例 Code 之後就懂很快,也可以把基本的 Thread 物件與 Lock物件兜出來,了卻一樁小小心願這樣XD

Code 如下:



import threading    #導入 threading 模組
from multiprocessing import Queue    #使用多核心的模組 Queue


#定義第一個線程工作

#num是給 job1 吃的參數,q是 Queue物件,而 lock 是線程鎖。

def job1(num, q, lock): 

    lock.acquire()    #鎖上這個線程,在完成之前不讓其他線程對變數做干擾。

    sum = 0           
    for i in range(num):
        sum += i

    q.put(sum) #把算出來的答案放入 Queue 中,後續再取出。
    lock.release() #解鎖這個線程,開始其他線程。
    #Thread 裡面的 function 不可以有 return, 不然會出錯。


#定義第二個線程工作
def job2(num, q, lock):
    lock.acquire()
    sum = 0
    for i in range(num):
        sum += i**10

    q.put(sum)
    lock.release()

#定義主程式
def main():
    lock = threading.Lock()  #命名一個 Lock 物件
    q = Queue() # 開一個 Queue 物件
    t1 = threading.Thread(target=job1, args=(8,q,lock)) 
                            #打開一個名字叫 t1 的線程物件
                            #這個物件會去呼叫 job1
                            #同時t1導入 q 跟 lock 做現成控制
                            #為什麼要這樣做...我也不知道XD

    t2 = threading.Thread(target=job2, args=(8,q,lock))

    t1.start()  #啟動 t1 線程
    t2.start()  #啟動 t2 線程
    t1.join()  #在 t1線程結束前阻止程式繼續運行
    t2.join()  #在 t2線程結束前阻止程式繼續運行

 #確認Queue是否為空,如果不是就用 q.get() 取出值
    while not q.empty():   
        print(q.get())
  
print "END Section!"

if __name__ == '__main__': main()


簡單的小範例~挺好兜的,不過真的的功能應該還要再把文件好好看過才是="=



# 6/20更新: 另外列出在stackoverflow上面別人列出 multiprocess 跟 multithread 的優劣評比,參考一下。

Multiprocessing

Pros

  • Separate memory space
  • Code is usually straightforward
  • Takes advantage of multiple CPUs & cores
  • Avoids GIL limitations for cPython
  • Eliminates most needs for synchronization primitives unless if you use shared memory (instead, it's more of a communication model for IPC)
  • Child processes are interruptible/killable
  • Python multiprocessing module includes useful abstractions with an interface much like threading.Thread
  • A must with cPython for CPU-bound processing

Cons

  • IPC a little more complicated with more overhead (communication model vs. shared memory/objects)
  • Larger memory footprint

Threading

Pros

  • Lightweight - low memory footprint
  • Shared memory - makes access to state from another context easier
  • Allows you to easily make responsive UIs
  • cPython C extension modules that properly release the GIL will run in parallel
  • Great option for I/O-bound applications

Cons

  • cPython - subject to the GIL
  • Not interruptible/killable
  • If not following a command queue/message pump model (using the Queue module), then manual use of synchronization primitives become a necessity (decisions are needed for the granularity of locking)
  • Code is usually harder to understand and to get right - the potential for race conditions increases dramatically

留言

這個網誌中的熱門文章

[python] 使用 python 控制 docx 範例

因為同事的需求,無職 a 我就又再度幫忙同事寫一些小程式。 這些小程式雖然簡單,但是聽到如果不幫忙寫程式解決,以手工作業的"大量人天" 的後果真的是讓人吐血。 他們有一份工作,需要產出一份很多很多很多資料圖片的判釋報告,要把數百張圖片剪裁成特定大小,加上圖說之後放入 word 裡面。 聽到的做法是...一張一張插圖!! wooow! That's really shocking me! 所以為了前公司同事的幸福,我還是加減寫一下好了。

[電銲] 自己的 IMU 自己焊!笨蛋的焊接法!

工程師真的是被要求包山包海都要會... IMU的組件被要求不能只插麵包板,要 "穩固的固定在另外製作的盒子裡",反正就是搞得跟外面幾十萬上下的 IMU 一樣精緻就是了。 好好好都焊給你~ 呃 對了 怎麼焊哈哈哈哈 ^^" 電焊這種技術自從上過國中的生活科技後就再也沒再用了@@,好家在這是個網路就是你家的時代,立刻上網查一查,找到一些關於焊槍使用的相關資料。 被要求說GY-91不能只接麵包板一定焊死才穩固所以就這樣接了

[RaspberryPI] 一鍵啟動 .py 文件

先講總結: 樹莓派君你好討厭啊啊啊啊! 今天把程式整理完之後,心血來潮,想要把 程式弄得更 "一鍵啟動" 一點。 也就是我只要用我的觸控螢幕一點,就可以直接打開寫好的 QT 介面做 IMU 和 相機的紀錄 親手烘培(?) 的 QT 介面