熱線電話:13121318867

登錄
首頁精彩閱讀Python threading多線程編程實例
Python threading多線程編程實例
2018-02-02
收藏

Python threading多線程編程實例

這篇文章主要介紹了Python threading多線程編程實例,本文講解了使用函數和線程類實現多線程編程的例子,需要的朋友可以參考下


Python 的多線程有兩種實現方法:

函數,線程類

1.函數

調用 thread 模塊中的 start_new_thread() 函數來創建線程,以線程函數的形式告訴線程該做什么

代碼如下:
# -*- coding: utf-8 -*-
import thread
def f(name):
  #定義線程函數
  print "this is " + name
 
if __name__ == '__main__':
  thread.start_new_thread(f, ("thread1",))
  #用start_new_thread()調用線程函數和其他參數
  while 1:
    pass

不過這種方法暫時沒能找到其他輔助方法,連主線程等待都要用 while 1 這種方法解決。

2.線程類

調用 threading 模塊,創建 threading.Thread 的子類來得到自定義線程類。

代碼如下:
# -*- coding: utf-8 -*-
import threading
class Th(threading.Thread):
  def __init__(self, name):
    threading.Thread.__init__(self)
    self.t_name = name
    #調用父類構造函數
 
  def run(self):
    #重寫run()函數,線程默認從此函數開始執行
    print "This is " + self.t_name
 
if __name__ == '__main__':
  thread1 = Th("Thread_1")
  thread1.start()
  #start()函數啟動線程,自動執行run()函數

threading.Thread 類的可繼承函數:
getName() 獲得線程對象名稱
setName() 設置線程對象名稱
join() 等待調用的線程結束后再運行之后的命令
setDaemon(bool) 阻塞模式, True: 父線程不等待子線程結束, False 等待,默認為 False
isDaemon() 判斷子線程是否和父線程一起結束,即 setDaemon() 設置的值
isAlive() 判斷線程是否在運行

實例

代碼如下:
import threading
import time
class Th(threading.Thread):
  def __init__(self, thread_name):
    threading.Thread.__init__(self)
    self.setName(thread_name)
 
  def run(self):
    print "This is thread " + self.getName()
    for i in range(5):
      time.sleep(1)
      print str(i)
    print self.getName() + "is over"

join() 阻塞等待

代碼如下:
if __name__ == '__main__':
    thread1 = Th("T1 ")
    thread1.start()
    #thread1.join()
    print "main thread is over"

不帶 thread1.join() ,得到如下結果:

代碼如下:
This is thread T1
main thread is over
0
1
2
T1 is over


不等待 thread1 完成,執行之后語句。
加了 thread1.join() ,得到如下結果:

代碼如下:
This is thread T1
0
1
2
T1 is over
main thread is over


阻塞等待 thread1 結束,才執行下面語句

主線程等待

代碼如下:
if __name__ == '__main__':
  thread1 = Th("T1 ")
  thread1.setDaemon(True)
  #要在線程執行之前就設置這個量
  thread1.start()
  print "main thread is over"

報錯: Exception in thread T1 (most likely raised during interpreter shutdown):
也就是主線程不等待子線程就結束了。

多個子線程

代碼如下:
if __name__ == '__main__':
    for i in range(3):
        t = Th(str(i))
        t.start()
    print "main thread is over"

這里的 t 可同時處理多個線程,即 t 為線程句柄,重新賦值不影響線程。

這里奇怪的是,運行 t.run() 時,不會再執行其他線程。雖不明,還是用 start() 吧。暫且理解為 start() 是非阻塞并行的,而 run 是阻塞的。

線程鎖

threading 提供線程鎖,可以實現線程同步。

代碼如下:
import threading
import time
class Th(threading.Thread):
  def __init__(self, thread_name):
    threading.Thread.__init__(self)
    self.setName(thread_name)
 
  def run(self):
    threadLock.acquire()
    #獲得鎖之后再運行
    print "This is thread " + self.getName()
    for i in range(3):
      time.sleep(1)
      print str(i)
    print self.getName() + " is over"
    threadLock.release()
    #釋放鎖
if __name__ == '__main__':
  threadLock = threading.Lock()
  #設置全局鎖
  thread1 = Th('Thread_1')
  thread2 = Th('Thread_2')
  thread1.start()
  thread2.start()

得到結果:

代碼如下:

This is thread Thread_1
0
1
2
Thread_1 is over
This is thread Thread_2
0
1
2
Thread_2 is over



數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢