程序以及狀態
1. 程序
程式:例如***.py這是程式,是乙個靜態的
程序:乙個程式執行起來後,**+用到的資源 稱之為程序,它是作業系統分配資源的基本單元。
不僅可以通過執行緒完成多工,程序也是可以的
2. 程序的狀態
工作中,任務數往往大於cpu的核數,即一定有一些任務正在執行,而另外一些任務在等待cpu進行執行,因此導致了有了不同的狀態
就緒態:執行的條件都已經慢去,正在等在cpu執行
執行態:cpu正在執行其功能
等待態:等待某些條件滿足,例如乙個程式sleep了,此時就處於等待態
linux上程序有5種狀態:
1. 執行(正在執行或在執行佇列中等待)
2. 中斷(休眠中, 受阻, 在等待某個條件的形成或接受到訊號)
3. 不可中斷(收到訊號不喚醒和不可執行, 程序必須等待直到有中斷發生)
4. 僵死(程序已終止, 但程序描述符存在, 直到父程序呼叫wait4()系統呼叫後釋放)
5. 停止(程序收到sigstop, sigstp, sigtin, sigtou訊號後停止執行執行)
ps工具標識程序的5種狀態碼:
d 不可中斷 uninterruptible sleep (usually io)
r 執行 runnable (on run queue)
s 中斷 sleeping
t 停止 traced or stopped
z 僵死 a defunct ("zombie") process
執行緒與程序是作業系統裡面的術語,簡單來講,每乙個應用程式都有乙個自己的程序。
作業系統會為這些程序分配一些執行資源,例如記憶體空間等。
在程序中,又可以建立一些執行緒,他們共享這些記憶體空間,並由作業系統呼叫,
以便平行計算。
32位系統受限於匯流排寬度,單個程序最多能夠訪問的位址空間
只有4g,利用實體地址擴充套件(pae)
技術,可以讓cpu訪問超過4g記憶體。但是在單個程序還是只能訪問4g
空間,pae的優勢是可以讓不同程序累計使用的記憶體超過4g。
在個人電腦上,還是建議使用64位系統,便於使用大記憶體
提公升程式的執行效能。
建立執行緒之後,執行緒並不是始終保持乙個狀態。其狀態大概如下:
執行緒有著不同的狀態,也有不同的型別。大致可分為:
gil即全域性直譯器鎖,它使得python的多執行緒無法充分利用
多核的優勢,但是對於i/o操作頻繁的爬蟲之類的程式,
利用多執行緒帶來的優勢還是很明顯的。
如果要利用多核優勢,還是用多程序吧。
可以直接使用top命令後,檢視%mem的內容。可以選擇按程序檢視或者按使用者檢視,如想檢視oracle使用者的程序記憶體使用情況的話可以使用如下的命令:
(1)top
top命令是linux下常用的效能分析工具,能夠實時顯示系統中各個程序的資源占用狀況,類似於windows的任務管理器
可以直接使用top命令後,檢視%mem的內容。可以選擇按程序檢視或者按使用者檢視,如想檢視oracle使用者的程序記憶體使用情況的話可以使用如下的命令:
$ top -u oracle
內容解釋:
pid:程序的id常用的命令:user:程序所有者
pr:程序的優先級別,越小越優先被執行
ninice:值
virt:程序占用的虛擬記憶體
res:程序占用的物理記憶體
shr:程序使用的共享記憶體
s:程序的狀態。s表示休眠,r表示正在執行,z表示僵死狀態,n表示該程序優先值為負數
%cpu:程序占用cpu的使用率
%mem:程序使用的物理記憶體和總記憶體的百分比
time+:該程序啟動後占用的總的cpu時間,即占用cpu使用時間的累加值。
command:程序啟動命令名稱
p:按%cpu使用率排行python中的多執行緒其實並不是真正的多執行緒,如果想要充分地使用多核cpu的資源,在python中大部分情況需要使用多程序。t:按mite+排行
m:按%mem排行
python提供了非常好用的多程序包multiprocessing,只需要定義乙個函式,python會完成其他所有事情。
借助這個包,可以輕鬆完成從單程序到併發執行的轉換。
multiprocessing支援子程序、通訊和共享資料、執行不同形式的同步,提供了process、queue、pipe、lock等元件。
1. 該題主描述了同樣的問題。我覺得比較有意義的回答是這個
multiprocessing.pool 只是用來啟動多個程序而不是在每個core上啟動乙個程序。換句話說python直譯器本身不會去在每個core或者processor去做負載均衡。這個是由作業系統決定的。
如果你的工作特別的計算密集型的話,作業系統確實會分配更多的core,但這也不是python或者**所能控制的或指定的。
multiprocessing.pool(num)中的num可以很小也可以很大,比如i/o密集型的操作,這個值完全可以大於cpu的個數。
硬體系統的資源分配是由作業系統決定的,如果你希望每個core都在工作,就需要更多的從作業系統出發了~
在後續的回答中給出了乙個stackoverflow裡面的此類問題介紹
實驗實驗環境:4c8g
1.工作任務設定成計算密集型
四個任務被均分到四個核上,順利執行
2.計算密集型+每個程序小記憶體消耗
四個任務被均分到四個核上,順利執行
3.計算密集型+每個程序大記憶體消耗
計算機卡死
---------------------
2018-12-18 今天好像找到問題了的原因了:
問題1:
例項:
# -*- coding:utf-8 -*-
from multiprocessing import process
import os
import time
nums = [11, 22]
def work1():
"""子程序要執行的**"""
print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums))
for i in range(3):
time.sleep(1)
print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums))
def work2():
"""子程序要執行的**"""
print("in process2 pid=%d ,nums=%s" % (os.getpid(), nums))
if __name__ == '__main__':
p1 = process(target=work1)
p1.start()
p1.join()
p2 = process(target=work2)
p2.start()
問題2:問題在於,多程序可以啟動,但是,所有子程序都處於等待狀態
可能是資源的問題。記憶體資源不夠,所以無法同時執行,只能等待!這只是猜想了。
參考:
python多程序 python多程序
當有多個非相關任務需要處理時,並行能大大提高處理速度。這裡簡要介紹python的multiprocessing模組。簡單多程序編寫 當我們任務數量確定而且比較少的時候,可以手動為每個任務指定乙個程序來執行。import multiprocessing as mp def f a print a if...
乍一看是「宕機」,實際上是
資料沒有丟,真好 本周一,雲頭條報道稱 github.com 已掛了 8 個小時 資料儲存裝置壞掉了 許多使用者在twitter上紛紛吐槽,抱怨 宕機,包括中國 日本的好多惴惴不安的程式設計師,一些人抱怨自己無法登入進去,或者分支版本丟失了,等等。乍一看,又是 宕機 惹的禍。可是,元芳,你怎麼看?疑...
python多程序 Python多程序實踐
建立程序方式如下 可以通過lock鎖機制實現共享鎖,但比較常用的方式還是以上這些方式,效率更高,更安全。使用方式 構造 類方法 使用方式 構造 更多型別支援一般使用manager,支援的型別包括list,dict,namespace,lock,rlock,semaphore,boundedsemap...