欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python中的多線程實例教程

系統 1608 0

本文以實例形式較為詳細的講述了Python中多線程的用法,在Python程序設計中有著比較廣泛的應用。分享給大家供大家參考之用。具體分析如下:

python中關于多線程的操作可以使用thread和threading模塊來實現,其中thread模塊在Py3中已經改名為_thread,不再推薦使用。而threading模塊是在thread之上進行了封裝,也是推薦使用的多線程模塊,本文主要基于threading模塊進行介紹。在某些版本中thread模塊可能不存在,要使用dump_threading來代替threading模塊。

一、線程創建

threading模塊中每個線程都是一個Thread對象,創建一個線程有兩種方式,一種是將函數傳遞到Thread對象中執行,另一種是從Thread繼承,然后重寫run方法(是不是跟Java很像)。

下面使用這兩種方法分別創建一個線程并同時執行

            
import random, threading
def threadFunction():
  for i in range(10):
    print 'ThreadFuction - %d'%i
    time.sleep(random.randrange(0,2))


class ThreadClass(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self);
    
  def run(self):
    for i in range(10):
      print 'ThreadClass - %d'%i
      time.sleep(random.randrange(0,2))

if __name__ == '__main__':
  tFunc = threading.Thread(target = threadFunction);
  tCls = ThreadClass()
  tFunc.start()
  tCls.start()


          

執行結果如下,可以看到兩個線程在交替打印。至于空行和一行多個輸出,是因為Py的print并不是線程安全的,在當前線程的print打印了部分內容后,準備打印換行之前,被別的線程中的print搶先,在換行之前打印了其它的內容。

            
ThreadFuction - 0
ThreadFuction - 1
ThreadFuction - 2
ThreadClass - 0
ThreadFuction - 3
ThreadClass - 1
ThreadFuction - 4
ThreadClass - 2
ThreadClass - 3
ThreadClass - 4ThreadFuction - 5

ThreadClass - 5
ThreadClass - 6
ThreadClass - 7
ThreadClass - 8
ThreadFuction - 6ThreadClass - 9

ThreadFuction - 7
ThreadFuction - 8
ThreadFuction - 9


          

Thread類的構造函數定義如下

            
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})

          

group: 留作ThreadGroup擴展使用,一般沒什么用
target:新線程的任務函數名
name:? 線程名,一般也沒什么用
args:? tuple參數
kwargs:dictionary參數

Thread類的成員變量和函數如下

start()???????? 啟動一個線程
run()?????????? 線程執行體,也是一般要重寫的內容
join([timeout]) 等待線程結束
name??????????? 線程名
ident?????????? 線程ID
daemon????????? 是否守護線程
isAlive()、is_alive()??? 線程是否存活
getName()、setName()???? Name的get&set方法
isDaemon()、setDaemon()? daemon的get&set方法

這里的守護線程與Linux中的守護進程并不是一個概念。這里是指當所有守護線程退出后主程序才會退出,否則即使線程任務沒有結束,只要不是守護線程,都會跟著主程序一起退出。而Linux中的守護進程定義正好相反,守護進程已經脫離父進程,不會隨著父進程的結束而退出。

二、線程同步

線程同步是多線程中的一個核心問題,threading模塊對線程同步有著良好的支持、包括線程特定數據、信號量、互斥鎖、條件變量等

1.線程特定數據

簡而言之,線程特定數據就是線程獨自持有的全局變量,相互之間的修改不會造成影響。

threading模塊中使用local()方法生成一個線程獨立對象,舉例如下,其中sleep(1)是為了保證讓子線程先運行完再運行接下來的語句。

            
data = threading.local()
def threadFunction():
  global data
  data.x = 3
  print threading.currentThread(), data.x
  
if __name__ == '__main__':
  data.x = 1
  tFunc = threading.Thread(target = threadFunction).start();
  time.sleep(1)
  print threading.current_thread(), data.x


          
            
               3
<_MainThread(MainThread, started 35888)> 1

            
          

輸出如上,可以看到,Thread-1中對data.x的修改并沒有影響到主線程中data.x的值。

2.互斥鎖

threading中定義了兩種鎖:threading.Lock和threading.RLock。兩者的不同在于后者是可重入鎖,也就是說在一個線程內重復LOCK同一個鎖不會發生死鎖,這與POSIX中的PTHREAD_MUTEX_RECURSIVE也就是可遞歸鎖的概念是相同的。

關于互斥鎖的API很簡單,只有三個函數――――分配鎖,上鎖,解鎖。

threading.Lock()??????? 分配一個互斥鎖
acquire([blocking=1])?? 上鎖(阻塞或者非阻塞,非阻塞時相當于try_lock,通過返回False表示已經被其它線程鎖住。)
release()?????????????? 解鎖
下面通過一個例子來說明互斥鎖的使用。在之前的例子中,多線程print會造成混亂的輸出,這里使用一個互斥鎖,來保證每行一定只有一個輸出。

            
def threadFunction(arg):
  while True:
    lock.acquire()
    print 'ThreadFuction - %d'%arg
    lock.release()

if __name__ == '__main__':
  lock = threading.Lock()
  threading.Thread(target = threadFunction, args=(1,)).start();
  threading.Thread(target = threadFunction, args=(2,)).start();


          

3.條件變量

條件變量總是與互斥鎖一起使用的,threading中的條件變量默認綁定了一個RLock,也可以在初始化條件變量的時候傳進去一個自己定義的鎖。

可用的函數如下

            
threading.Condition([lock]) 分配一個條件變量
acquire(*args)        條件變量上鎖
release()          條件變量解鎖
wait([timeout])       等待喚醒,timeout表示超時
notify(n=1)         喚醒最大n個等待的線程
notifyAll()、notify_all()  喚醒所有等待的線程
下面這個例子使用條件變量來控制兩個線程交替運行

num = 0
def threadFunction(arg):
  global num
  while num < 10:
    cond.acquire()
    while num % 2 != arg:
      cond.wait()
    print 'Thread %d - %d' %(arg, num)
    num += 1
    cond.notify()
    cond.release()

if __name__ == '__main__':
  cond = threading.Condition()
  threading.Thread(target = threadFunction, args=(0,)).start();
  threading.Thread(target = threadFunction, args=(1,)).start();


          

輸出如下

            
Thread 0 - 0
Thread 1 - 1
Thread 0 - 2
Thread 1 - 3
Thread 0 - 4
Thread 1 - 5
Thread 0 - 6
Thread 1 - 7
Thread 0 - 8
Thread 1 - 9
Thread 0 - 10


          

其實上面這個程序是有問題的,我們想打印的是0~9,但實際上10也被打印了出來,原因很簡單,因為兩個線程交替打印,使得num在一個線程中可能加2,從而導致10被打印出來,所以必須在打印前再次check。

相信本文所述對大家的Python程序設計有一定的借鑒價值。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: www.youjizz.com亚洲| 日本亚洲精品色婷婷在线影院 | 日韩一区二区三区在线看 | 亚洲成人精品 | 黄色毛片视频网站 | 人人干人人模 | 欧美影院| www.久久99| 青春草在线观看 | 久久久久伊人 | 亚洲区色| 婷五月综合 | 国产酒店视频 | 美国黄色网址 | 婷婷的久久五月综合先锋影音 | 99热99色 | 免费一区二区三区 | 全黄裸片武则天一级第4季 亚洲一区国产 | 2021国产视频 | 毛片av网 | 91看片淫黄大片一级在线观看 | 99久久精约久久久久久清纯 | 亚洲综合色丁香婷婷六月图片 | 欧美一级在线免费 | 九九re6精品视频在线观看 | 国产三级在线精品男人的天堂 | 久久久伊人色综合A片无码 国产精品区一区二区三 | 欧美一区二区三区久久久 | 久热国产精品视频 | 国产成人久久精品二区三区牛 | 暖暖日本在线播放 | 精品二区| 日本人强jizz多人高清 | 欧美成人精品不卡视频在线观看 | 成年免费视频网站入口 | 2021国产精品 | 国产小视频免费在线观看 | 欧美性xxxx交| 国产网址在线观看 | 国产高清网址 | 小明成人免费视频 |