進程與線程

線程是屬于進程的,線程運行在進程空間內(nèi),同一進程所產(chǎn)生的線程共享同一內(nèi)存空間,當(dāng)進程退出時該進程所產(chǎn)生的線程都會被強制退出并清除。線程可與屬于同一進程的其它線程共享進程所擁有的全部資源,但是其本身基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的信息(如程序計數(shù)器、一組寄存器和棧)。

threading模塊

import threading
import time
 
def worker(num):
    """
    thread worker function
    :return:
    """
    time.sleep(1)
    print("Thread %d" % num)
    return
 
for i in range(20):
    t = threading.Thread(target=worker,args=(i,),name=“t.%d” % i)
    t.start()

queue模塊

Queue 就是對隊列,它是線程安全的
舉例來說,我們?nèi)タ系禄燥垺N房是給我們做飯的地方,前臺負(fù)責(zé)把廚房做好的飯賣給顧客,顧客則去前臺領(lǐng)取做好的飯。這里的前臺就相當(dāng)于我們的隊列。

這個模型也叫生產(chǎn)者-消費者模型。


import queue

q = queue.Queue(maxsize=0)  # 構(gòu)造一個先進顯出隊列,maxsize指定隊列長度,為0 時,表示隊列長度無限制。

q.join()    # 等到隊列為kong的時候,在執(zhí)行別的操作
q.qsize()   # 返回隊列的大小 (不可靠)
q.empty()   # 當(dāng)隊列為空的時候,返回True 否則返回False (不可靠)
q.full()    # 當(dāng)隊列滿的時候,返回True,否則返回False (不可靠)
q.put(item, block=True, timeout=None) #  將item放入Queue尾部,item必須存在,可以參數(shù)block默認(rèn)為True,表示當(dāng)隊列滿時,會等待隊列給出可用位置,
                         為False時為非阻塞,此時如果隊列已滿,會引發(fā)queue.Full 異常。 可選參數(shù)timeout,表示 會阻塞設(shè)置的時間,過后,
                          如果隊列無法給出放入item的位置,則引發(fā) queue.Full 異常
q.get(block=True, timeout=None) #   移除并返回隊列頭部的一個值,可選參數(shù)block默認(rèn)為True,表示獲取值的時候,如果隊列為空,則阻塞,為False時,不阻塞,
                      若此時隊列為空,則引發(fā) queue.Empty異常。 可選參數(shù)timeout,表示會阻塞設(shè)置的時候,過后,如果隊列為空,則引發(fā)Empty異常。
q.put_nowait(item) #   等效于 put(item,block=False)
q.get_nowait() #    等效于 get(item,block=False)

multiprocessing模塊

multiprocessing是python的多進程管理包,和threading.Thread類似。在multiprocessing中,通過創(chuàng)建Process對象生成進程,然后調(diào)用它的start()方法,

進程間的數(shù)據(jù)共享

在使用并發(fā)設(shè)計的時候最好盡可能的避免共享數(shù)據(jù),尤其是在使用多進程的時候。

進程池的方法

apply(func[, args[, kwds]]) :使用arg和kwds參數(shù)調(diào)用func函數(shù),結(jié)果返回前會一直阻塞,由于這個原因,apply_async()更適合并發(fā)執(zhí)行,另外,func函數(shù)僅被pool中的一個進程運行。

apply_async(func[, args[, kwds[, callback[, error_callback]]]]) : apply()方法的一個變體,會返回一個結(jié)果對象。如果callback被指定,那么callback可以接收一個參數(shù)然后被調(diào)用,當(dāng)結(jié)果準(zhǔn)備好回調(diào)時會調(diào)用callback,調(diào)用失敗時,則用error_callback替換callback。 Callbacks應(yīng)被立即完成,否則處理結(jié)果的線程會被阻塞。

close() : 阻止更多的任務(wù)提交到pool,待任務(wù)完成后,工作進程會退出。

terminate() : 不管任務(wù)是否完成,立即停止工作進程。在對pool對象進程垃圾回收的時候,會立即調(diào)用terminate()。

join() : wait工作線程的退出,在調(diào)用join()前,必須調(diào)用close() or terminate()。這樣是因為被終止的進程需要被父進程調(diào)用wait(join等價與wait),否則進程會成為僵尸進程。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容