併發程式設計一

2022-08-10 12:42:18 字數 3331 閱讀 2850

概念:正在進行的乙個任務;程式只是**,而程序是指程式的執行狀態,乙個程式執行兩次,也是兩個程序

# 程序是計算機中最小的資源分配單位(程序是負責圈資源)

# 執行緒是計算機中能被cpu排程的最小單位 (執行緒是負責執行具體**的)

# 執行緒 後面的爬蟲階段經常用;程序:資料分析或者是高計算的程式;協程:非同步的框架 非同步的爬蟲模組

# p.start():啟動程序,並呼叫該子程序中的p.run() 

# p.run():程序啟動時執行的方法,正是它去呼叫target指定的函式,我們自定義類的類中一定要實現該方法

p.terminate():強制終止程序p,不會進行任何清理操作,如果p建立了子程序,該子程序就成了殭屍程序,使用該方法需要特別小心這種情況。如果p還儲存了乙個鎖那麼也將不會被釋放,進而導致死鎖

p.is_alive():如果p仍然執行,返回true

# p.join([timeout]):主線程等待p終止(強調:是主線程處於等的狀態,而p是處於執行的狀態)。timeout是可選的超時時間,需要強調的是,p.join只能join住start開啟的程序,而不能join住run開啟的程序

p.daemon:預設值為false,如果設為true,代表p為後台執行的守護程序,當p的父程序終止時,p也隨之終止,並且設定為true後,p不能建立自己的新程序,必須在p.start()之前設定

p.name:程序的名稱

# p.pid:程序的pid

p.exitcode:程序在執行時為none、如果為–n,表示被訊號n結束(了解即可)

p.authkey:程序的身份驗證鍵,預設是由os.urandom()隨機生成的32字元的字串。這個鍵的用途是為涉及網路連線的底層程序間通訊提供安全性,這類連線只有在具有相同的身份驗證鍵時才能成功(了解即可)

程彼此之間互相隔離,要實現程序間通訊(ipc),multiprocessing模組支援兩種形式:佇列和管道,這兩種方式都是使用訊息傳遞的

建立佇列的類(底層就是以管道和鎖定的方式實現):以後的分布式架構和訊息佇列都是基於此演變而來

# queue([maxsize]):建立共享的程序佇列,queue是多程序安全的佇列,可以使用queue實現多程序之間的資料傳遞。 maxsize是佇列中允許最大項數,若有值,則只能放固定多個值,省略則無大小限制
# q.put方法用以插入資料到佇列中,put方法還有兩個可選引數:blocked和timeout。如果blocked為true(預設值),並且timeout為正值,該方法會阻塞timeout指定的時間,直到該佇列有剩餘的空間。如果超時,會丟擲queue.full異常。如果blocked為false,但該queue已滿,會立即丟擲queue.full異常。

# q.get方法可以從佇列讀取並且刪除乙個元素。同樣,get方法有兩個可選引數:blocked和timeout。如果blocked為true(預設值),並且timeout為正值,那麼在等待時間內沒有取到任何元素,會丟擲queue.empty異常。如果blocked為false,有兩種情況存在,如果queue有乙個值可用,則立即返回該值,否則,如果隊列為空,則立即丟擲queue.empty異常.

q.get_nowait():同q.get(false) # 取值不等待

q.put_nowait():同q.put(false) # 放值不等待

7 q.empty():呼叫此方法時q為空則返回true,該結果不可靠,比如在返回true的過程中,如果佇列中又加入了專案。

8 q.full():呼叫此方法時q已滿則返回true,該結果不可靠,比如在返回true的過程中,如果佇列中的專案被取走。

9 q.qsize():返回佇列中目前專案的正確數量,結果也不可靠,理由同q.empty()和q.full()一樣

from multiprocessing import queue   佇列  先進先出

# 例項化得到要給物件

q=queue(5) # 預設很大,可以放很多,寫了個5,只能放5個

# 往管道中放值

q.put(1)

q.put('lqz')

q.put(18)

q.put(19)

# q.put(20)

# q.put(21)

# q.put_nowait(100)

# 從管道中取值

# print(q.get())

# print(q.get())

# print(q.get())

# print(q.get(timeout=100)) # 等0.1s還沒有值,就結束

# print(q.get_nowait()) # 不等了,有就是有,沒有就沒有

print(q.empty()) # 看一下佇列是不是空的

print(q.full()) # 看一下佇列是不是滿的

'''q=queue(佇列大小)

# 放值

q.put(asdf)

q.put_nowait(asdf) # 佇列滿了,放不進去就不放了,報錯

# 取值

q.get() # 從佇列頭部取出乙個值

q.get_nowait() # 從佇列頭部取值,沒有就拋錯

# 佇列是否為空,是否滿

print(q.empty()) # 看一下佇列是不是空的

print(q.full()) # 看一下佇列是不是滿的

其他方法(了解):

1 q.cancel_join_thread():不會在程序退出時自動連線後台執行緒。可以防止join_thread()方法阻塞

2 q.close():關閉佇列,防止佇列中加入更多資料。呼叫此方法,後台執行緒將繼續寫入那些已經入佇列但尚未寫入的資料,但將在此方法完成時馬上關閉。如果q被垃圾收集,將呼叫此方法。關閉佇列不會在佇列使用者中產生任何型別的資料結束訊號或異常。例如,如果某個使用者正在被阻塞在get()操作上,關閉生產者中的佇列不會導致get()方法返回錯誤。

3 q.join_thread():連線佇列的後台執行緒。此方法用於在呼叫q.close()方法之後,等待所有佇列項被消耗。預設情況下,此方法由不是q的原始創

tasklist檢視程序id號tasklist | findstr程序id號os.getpid()macps aux|grep程序號

併發程式設計(一)

該系列為併發程式設計,在幾乎所有的程式語言中,併發始終是繞不開的坎,可以說學習一門程式語言,學好了併發就說明這門語言你學的還可以.所以接下來就讓我們好好看看 python 的併發是怎麼實現的吧.在學習併發之前,有必要學習一下計算機作業系統發展史,因為可以實現併發可作業系統的發展是分不開的.作業系統的...

併發程式設計筆記(一)

1.執行緒安全 執行緒安全是指當多個執行緒同時訪問乙個物件 方法 類 的時候,該物件 方法 類 都能表現出正確的行為,那麼就表示是執行緒安全的。2.synchronized關鍵字 synchronized可以加在任意的物件或方法上,我們稱之為互斥區。當多個執行緒訪問互斥區的時候,是按照排隊的形式訪問...

Java併發程式設計一

不要用run 來開啟執行緒,它只會在當前執行緒中,序列執行run 方法中的 建立執行緒時,推薦傳入runnable介面的例項,因為預設的thread.run 就是直接呼叫內部的runnable介面,這樣避免了過載thread.run 因此使用runnable介面來告訴執行緒該做什麼更為合理。publ...