python取進程pid
『壹』 python中的os.getpid是什麼,pid有什麼用
getpid是獲得當前進程的進程號。系統每開辟一個新進程就會為他分配一個進程號。在多進程的時候會用到吧好像。
『貳』 python 獲取指定進程pid,怎麼總是錯
簡答:
通過知道對應的進程名,可以獲得進程,然後進一步獲取進程信息。
詳解,自己去看吧:
【記錄】折騰Python中的psutil:一個用於獲得處理器和系統相關信息的模塊
(此處不能貼地址,請自己用google搜標題,即可找到帖子地址)
『叄』 Python 爬蟲進階篇——diskcahce緩存(二)
上一篇文章為大家介紹了diskcache的基礎用法,本文將繼續深入探討diskcache的更多高級功能。
關於diskcache,它是一種基於SQLite資料庫的緩存對象管理方式。SQLite是一個輕量級的基於磁碟的資料庫,它不需要單獨的伺服器進程,並支持SQL查詢。在上篇文章的源碼截圖上,你可以看到一些SQL語句的使用。
diskcache支持使用diskcache.FanoutCache自動分片基礎資料庫。分片是對數據進行水平分區,可以減少寫入時的阻塞。盡管讀和寫不會互相阻礙,但寫入會阻礙其他寫入。分片的默認值為8。
以下是一個示例代碼:
# 示例代碼
在示例中,我們在diskcache_2文件夾中創建了一個具有四個分片和一秒超時的緩存。如果操作耗時超過一秒,它們將嘗試中止操作。
那麼每一個分片的大小是多少呢?分片的大小都是平均分配的,占總空間的四分之一。diskcache的默認大小為1GB。
diskcache提供了一個collections.deque兼容的雙端隊列diskcache.Deque。雙端隊列是堆棧和隊列的一般化,可以在前後都可以進行快速訪問和編輯,且可持久化,操作比較便捷。
以下是一個示例代碼:
# 示例代碼
運行結果如下:
Popleft 獲取隊列最前面的一個元素,pop獲取末尾的一個元素;
Appendleft 在隊列最開始添加一個元素,append 在末尾添加一個元素;
Extendleft 在隊列最開始添加一個數組,extend在末尾添加一個數組;
那麼deque的存儲位置在哪裡?可以使用以下命令查看隊列的存儲位置:
包括cache也是一個可以使用directory屬性查看默認存儲的位置;
那麼如何指定directory呢?Deque的第二個參數指定存儲位置,第一個參數為隊列的初始值。或者可以直接指定參數名稱,如下:
Index 類似於dict(字典),可持久化,使用也比較便捷。以下是一個示例:
# 示例代碼
popitem表示獲取最後一個鍵對值,並且刪除,結果如下:
peekitem() 可傳遞last 參數是否獲取最後一個,不會刪除原始值;
setdefault(key,default) 可以給指定的key值設置默認值,在查找時可以預先設置一個默認值,防止key值不存在而拋出異常。
keys()與values()可以查找所有Index中的key值與value值,然而沒有提供判斷key值是否存在的方法,但是可以使用setdefault的方法自行封裝。
Lock還記得上篇文章中提到的Lock鎖嗎?先看一下源碼:
可以看到這里的鎖用的就是cache的add方法的特性,源碼中也給出了使用的方式:
從源碼上看有一個while 死循環,直到add成功時才會被釋放,這里處理的方式不是很好,可能會造成死鎖,所以一般情況下,都會添加一個過期的時間,如下:
RLock還有一種RLock鎖,與Lock鎖的區別是RLock允許在同一線程中被多次acquire。而Lock卻不允許這種情況。以下是一個示例:
結果是執行成功。
看一下源碼:
從源碼中可以看出,判斷鎖的條件是os.getpid()(進程pid)與threading.get_ident()(線程標識符),如果每次acquire時的pid與ident都相同的時,即可成功。那麼就可以在相同的進程中無限次數的acquire,但是多少次acquire就得多少次的release,防止死鎖。
那麼是使用Lock還是RLock呢?這個要具體的看實際情況,並不是誰就一定好。
總結本次推文中介紹了diskcache中FanoutCache緩存分片、雙端隊列deque、Index、Lock以及RLock。
大家可以在實際中靈活運用,diskcache緩存的優勢還是很大的,無需安裝其他的模塊,並且在文件管理器中能直接查看,還可以利用緩存的一些特性使用多線程的去實現業務等。
但是也是有缺點的,即受制於本地文件系統的限制。每個磁碟每個目錄下的文件數量是有限制的,所以需要結合實際情況使用。