教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Python線程與進程手記

更新時間:2018年09月21日17時23分 來源:傳智播客 瀏覽次數:

#線程應用的第一種方式:thread模塊是比較底層的模塊
#import thread:引用的模塊
#thread.start_new_thread(defName,()):線程的創(chuàng)建
#thread.exit_thread():線程的結束

#線程應用的第二種方式:threading模塊是對thread做了一些包裝,可以更方便被引用
#import threading:引用的模塊
#myThread=threading.Thread(target=defName,args=('Alice',)):線程的創(chuàng)建
#myThread.start():線程開始執(zhí)行
#num=len(threading.enumerate):線程數量的查看
#線程應用的第三種方式:創(chuàng)建一個線程類,繼承基類:threading.Thread 。重寫def run(self):方法。需要運行的內容,寫在run方法里面。
#class MyThread(threading.Thread):創(chuàng)建類的對象
#可以進行重構函數的對應擴展:def __init__(self,name,time):threading.Thread.__init__(self,name='對應的線程名字')
#myThread=MyThread():創(chuàng)建對象
#myThread.start():線程開始執(zhí)行
------------------------------線程同步之互斥鎖---------------------------
#線程同步之互斥鎖
#互斥鎖同步:線程同步能夠保證多個線程安全訪問競爭資源,最簡單的同步機制是引用互斥鎖?;コ怄i為資源引入一個狀態(tài):鎖定/非鎖定。某個線程要更改共享數據時,先將其鎖定,此時資源的狀態(tài)為“鎖定”,其他線程不能更改;直到該線程釋放資源,將資源的狀態(tài)變成“非鎖定”,其他的線程才能再次鎖定該資源。
#mutex=threading.Lock():創(chuàng)建互斥鎖
#if mutex.acquire([blocking]):互斥鎖鎖定狀態(tài),返回值不為0表示上鎖成功
#        鎖定方法acquire可以有一個blocking參數。如果設定blocking為True,則當前線程會堵塞,直到獲取到這個鎖為止(如果沒有指定,那么默認為True);如果設定blocking為False,則當前線程不會堵塞
#mutex.release():互斥鎖釋放狀態(tài)

------------------------------線程同步至可重入鎖---------------------------
#線程同步之可重入鎖
#RLock內部維護著一個Lock和一個counter變量,counter記錄了acquire的次數,從而使得資源可以被多次acquire。直到一個線程所有的acquire都被release,其他的線程才能獲得資源:
#mutex=threading.RLock():創(chuàng)建可重入鎖
#mutex.acquire():可重入鎖鎖定狀態(tài)
#mutex.release():可重入鎖釋放狀態(tài)
------------------------------線程同步之條件變量---------------------------
#線程同步之條件變量
#Python提供的Condition對象提供了對復雜線程同步問題的支持。Condition被稱為條件變量,除了提供與Lock類似的acquire和release方法外,還提供了wait和notify方法。線程首先acquire一個條件變量,然后判斷一些條件。如果條件不滿足則wait;如果條件滿足,進行一些處理改變條件后,通過notify方法通知其他線程,其他處于wait狀態(tài)的線程接到通知后會重新判斷條件。不斷的重復這一過程,從而解決復雜的同步問題。
#Condition對象維護了一個鎖(Lock/RLock)和一個waiting池。線程通過acquire獲得Condition對象,當調用wait方法時,線程會釋放Condition內部的鎖并進入blocked狀態(tài),同時在waiting池中記錄這個線程。當調用notify方法時,Condition對象會從waiting池中挑選一個線程,通知其調用acquire方法嘗試取到鎖。
#Condition對象的構造函數可以接受一個Lock/RLock對象作為參數,如果沒有指定,則Condition對象會在內部自行創(chuàng)建一個RLock。
#除了notify方法外,Condition對象還提供了notifyAll方法,可以通知waiting池中的所有線程嘗試acquire內部鎖。由于上述機制,處于waiting狀態(tài)的線程只能通過notify方法喚醒,所以notifyAll的作用在于防止有線程永遠處于沉默狀態(tài)。
#con=threading.Condition():創(chuàng)建條件變量
#con.acquire():條件變量鎖定狀態(tài)
#con.wait():線程釋放Condition內部的鎖并進入blocked狀態(tài),同時在waiting池中記錄這個線程
#con.notify():Condition對象會從waiting池中挑選一個線程,通知其調用acquire方法嘗試取到鎖
#con.notifyAll():喚醒所有處于waiting池中的所有線程,防止有線程永遠處于沉默狀態(tài)
#con.release():條件變量釋放狀態(tài)

------------------------------線程同步之隊列---------------------------
#from Queue import Queue:進行對應的隊列包的引用
#queue=Queue():隊列的創(chuàng)建
#queue.qsize():獲取隊列中內容的數量
#queue.put(內容):向隊列中添加對應的數據信息
#queue.set():從隊列中取出對應的數據
#queue.empty():查看當前隊列內容是否為空
 線程隊列實現(xiàn)生產者消費者
------------------------------線程間通信---------------------------
threading.Event可以使一個線程等待其他線程的通知。其內置了一個標志,初始值為False。線程通過wait()方法進入等待狀態(tài),直到另一個線程調用set()方法將內置標志設置為True時,Event通知所有等待狀態(tài)的線程恢復運行。還可以通過isSet()方法查詢Envent對象內置狀態(tài)的當前值。
#event=threading.Event():進行對應Envent對象的創(chuàng)建
#self.threadEvent=event :重構對應threading.Thread基類中的__init__的方法。 
#self.threadEvent.wait():使線程進入等待狀態(tài)
#event.set():啟動waiting池中等待的線程

------------------------------線程的合并和后臺線程---------------------------
python的Thread類中還提供了join()方法,使得一個線程可以等待另一個線程執(zhí)行結束后再繼續(xù)運行。這個方法還可以設定一個timeout參數,避免無休止的等待。因為兩個線程順序完成,看起來象一個線程,所以稱為線程的合并。
默認情況下,主線程在退出時會等待所有子線程的結束。如果希望主線程不等待子線程,而是在退出時自動結束所有的子線程,就需要設置子線程為后臺線程(daemon)。方法是通過調用線程類的setDaemon()方法。
#myThread.setDaemon(True):將該線程轉為后臺線程

------------------------------ThreadLocal---------------------------
global_dict={}
global_dict[threading.current_thread()]

------------------------------多進程---------------------------
在Unix/Linux操作系統(tǒng)中,提供了一個fork()系統(tǒng)函數,它非常特殊。
普通的函數調用,調用一次,返回一次,但是fork()調用一次,返回兩次,因為操作系統(tǒng)自動把當前進程(稱為父進程)復制了一份(稱為子進程),然后,分別在父進程和子進程內返回。
子進程永遠返回0,而父進程返回子進程的ID。
這樣做的理由是,一個父進程可以fork出很多子進程,所以,父進程要記下每個子進程的ID,而子進程只需要調用getppid()就可以拿到父進程的ID。
#import os :引用對應的進程包
#pid=os.fork():程序執(zhí)行到os.fork()時,操作系統(tǒng)會創(chuàng)建一個新的進程(子進程),然后復制父進程的所有信息到子進程中,然后父進程和子進程都會從fork()函數中得到一個返回值,其進程中這個值一定是0,而父進程中是子進程的 id號
#os.getpid():獲取當前進程的pid
#os.getppid():獲取父進程的pid
------------------------------multiprocessing模塊---------------------------
#from multiprocessing import Process:multiprocessing模塊提供了一個Process類來代表一個進程對象。
#p=Process(target=run_proc,args=('test',)):創(chuàng)建對應的進程對象
#p.start():進程的啟動
#p.join():multiprocessing模塊提供了一個Process類來代表一個進程對象,下面的例子演示了啟動一個子進程并等待其結束
#multiprocessing.cpu_count():查看對應的cpu核數
#pipe=multiprocessing.Pipe():創(chuàng)建一個管道,管道兩個端口調用分別為pipe[0],pipe[1]
#pipe[0].send(i):為管道一側進行內容的添加操作
#pipe[0].recv():獲取管道一側的內容信息



作者:傳智播客Python+人工智能開發(fā)培訓學院
首發(fā):
http://python.itcast.cn/
0 分享到:
和我們在線交談!