day9 python學習隨筆

一、threading

問答:

  • 應用程序、進程、線程關係?

  • 爲什麼要使用多個CPU ?

  • 爲什麼要使用多線程?

  • 爲什麼要使用多進程?

  • java和C#中的多線程和python多線程的區別?

  • Python GIL?

  • 線程和進程的選擇:計算密集型和IO密集型程序。(IO操作不佔用CPU)

1、Python線程

Threading用於提供線程相關的操作,線程是應用程序中工作的最小單元。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
import time
 
def show(arg):
    time.sleep(1)
    print 'thread'+str(arg)
 
for i in range(10):
    t = threading.Thread(target=show, args=(i,))
    t.start()
 
print 'main thread stop'

上述代碼創建了10個“前臺”線程,然後控制器就交給了CPU,CPU根據指定算法進行調度,分片執行指令。


更多方法:

  • start            線程準備就緒,等待CPU調度

  • setName      爲線程設置名稱

  • getName      獲取線程名稱

  • setDaemon   設置爲後臺線程或前臺線程(默認)
                       如果是後臺線程,主線程執行過程中,後臺線程也在進行,主線程執行完畢後,後臺線程不論成功與否,均停止
                        如果是前臺線程,主線程執行過程中,前臺線程也在進行,主線程執行完畢後,等待前臺線程也執行完成後,程序停止

  • join               逐個執行每個線程,執行完畢後繼續往下執行...

  • run              線程被cpu調度後執行此方法

2、線程鎖

由於線程之間是進行隨機調度,並且每個線程可能只執行n條執行之後,CPU接着執行其他線程。所以,可能出現如下問題:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
import time

gl_num = 0

def show(arg):
    global gl_num
    time.sleep(1)
    gl_num +=1
    print gl_num

for i in range(10):
    t = threading.Thread(target=show, args=(i,))
    t.start()

print 'main thread stop'

未使用線程鎖
#!/usr/bin/env python
#coding:utf-8
  
import threading
import time
  
gl_num = 0
  
lock = threading.RLock()
  
def Func():
    lock.acquire()
    global gl_num
    gl_num +=1
    time.sleep(1)
    print gl_num
    lock.release()
      
for i in range(10):
    t = threading.Thread(target=Func)
    t.start()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章