線程是屬于進程的,線程運行在進程空間內(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),否則進程會成為僵尸進程。