国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python threading多線程編程實例

2019-11-25 18:13:04
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 应城市| 福海县| 洛浦县| 白朗县| 桂林市| 武穴市| 同德县| 玉山县| 上思县| 抚顺市| 和静县| 阜平县| 洛南县| 舞阳县| 凤凰县| 水城县| 南雄市| 江孜县| 平山县| 和顺县| 阿鲁科尔沁旗| 鄂伦春自治旗| 策勒县| 黔江区| 太仓市| 浑源县| 绥江县| 伽师县| 乐平市| 峨边| 荔浦县| 布拖县| 太康县| 库车县| 六枝特区| 锡林浩特市| 德江县| 扬州市| 临夏县| 阳朔县| 安康市|