python 多程序,實際上都沒有執行,sleep

2021-09-07 20:44:03 字數 3793 閱讀 9879

程序以及狀態

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使用率排行

t:按mite+排行

m:按%mem排行

python中的多執行緒其實並不是真正的多執行緒,如果想要充分地使用多核cpu的資源,在python中大部分情況需要使用多程序。

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...