將程序掛起(suspend) 而非 阻塞(block)
如果用sleep() 程序將阻塞
假設程序下有兩個執行緒 那麼這兩個執行緒會繼續執行
要使程序掛起 可以考慮使用psutil
import psutil
p = psutil.process(pid)
p.suspend() #掛起程序
p.resume() #恢復程序
為了證明效果 我寫了乙個簡單的程序process
其下有兩個執行緒 讀者reader 和 寫者writer(簡單的讀者寫者問題)
process:
import threading
from time import ctime, sleep
import threadinreadandwriteproblem
import multiprocessing
import os
class process(multiprocessing.process):
def __init__(self):
multiprocessing.process.__init__(self) #手動實現父類
pid = os.getpid()
def run(self):
print '當前執行程序pid : %s ' %self.pid #子執行緒的id與父程序的pid相同 屬於 同乙個程序
for i in range(0,5):
r = threadinreadandwriteproblem.reader()
w = threadinreadandwriteproblem.writer()
w.start()
r.start()
print '程序阻塞'
sleep(10) #總共執行時間10秒
reader&writer
import threading
from time import ctime, sleep
import os
mutex = threading.lock() #互斥鎖
mutex_readercount = threading.lock() #計數時的互斥 計算當前正在讀的數目
readercount = 0 number = 0
#不滿足條件的 進入阻塞狀態
class reader(threading.thread): #讀者
def __init__(self):
threading.thread.__init__(self) #繼承父類建構函式
def run(self):
global mutex
global readercount
#print '執行緒pid: %s ' %os.getpid()
while true:
mutex_readercount.acquire()
readercount +=1
if readercount == 1:
print '讀者程序等待中,編號%s' %(self.name)
mutex.acquire() == false # 第乙個需要申請
mutex_readercount.release()
print '開始讀 , 讀者編號 %s ,現在時間是 %s' %(self.name,ctime())
sleep(2)
print '完成讀 , 讀者編號 %s程式設計客棧 , 現在時間是 %s' %(self.name,ctime())
mutex_readercount.acquire()
readercount -= 1
if readercount == 0: #所有讀者均完成
print '最後乙個讀者完成讀 '
mutex.release()
mutex_readercount.release()
class writer(threading.thread): #寫者
def __init__(self):
threading.thread.__init__(self)
def run(self):
global mutex
global writercount
#print '執行緒pid: %s' %os.getpid()
while true:
print '寫者程序等待中 編號: %s' %(self.name)
mutex.acquire()
print '開始寫 編號:%s 現在時間是: %s ' %(self.name,ctime())
sleep(5)
print '結束寫 編號: %s 現在時間是 %s' %(self.name,ctime())
mutex.release()
測試程式
import threadinreadandwriteproblem
import singleprocessschedulermultiprocess
import psutil
import scheduler
from time impor程式設計客棧t ctime, sleep
def main():
p = singleprocessschedulermultiprocess.process()
p.start()
sleep(3)
stop(p.pid)
print '程序掛起 %s' %ctime()
sleep(5)
wake(p.pid)
print '喚醒程序 %s' %ctime()
def stop(pid):
print '程序暫停 程序編號 %s ' %(pid)
p = psutil.process(pid)
p.suspend()
def wake(pid):
www.cppcns.com print '程序恢復 程序編號 %s ' %(pid)
p = psutil.process(pid)
p.resume()
if __name__ == '__main__':
main()
結果:當前執行程序pid : 3096
寫者程序等待中 編號: thread-2
開始寫 編號:thread-2 現在時間是: mon nov 30 21:12:12 2015
讀者程序等待中,編號thread-1
寫者程序等待中 編號: thread-4
程序阻塞
寫者程序等待中 編號: thread-6
寫者程序等待中 編號: thread-8
寫者程序等待中 編號: thread-10
程序暫停 程序編號 3096
程序掛起 mon nov 30 21:12:15 2015
程序恢復 程序編號 3096
喚醒程序 mon nov 30 21:12:20 2015
結束寫 編號: thread-2 現在時間是 mon nov 30 21:12:20 2015
寫者程序等待中 編號: thread-2
開始讀 , 讀者編號 thread-1 ,現在時間是 mon nov 30 21:12:20 2015
開始讀 , 讀者編號 thread-3 ,現在時間是 mon nov 30 21:12:20 2015
開始讀 , 讀者編號 thread-5 ,現在時間是 mon nov 30 21:12:20 2015
開始讀 , 讀者編號 thread-7 ,現在時間是 mon nov 30 21:12:20 2015
開始讀 , 讀者編號 thread-9 ,現在時間是 mon nov 30 21:12:20 2015
完成讀 , 讀者編號 thread-1 , 現在時間是 mon nov 30 21:12:22 2015
完成讀 , 讀者編號 thread-3 , 現在時間是 mon nov 30 21:12:22 2015
完成讀 , 讀者編號 thread-5 , 現在時間是 mon nov 30 21:12:22 2015
完成讀 , 讀者編號 thread-7 , 現在時間是 mon nov 30 21:12:22www.cppcns.com 2015
總結本文標題: python程式暫停的正常處理方法
本文位址:
Python基礎之程式暫停
當我們執行某些程式時,由於機器速度很快導致肉眼無法直接看到執行結果時程式便停止執行。這時候我們迫切需要在程式中暫停,專業術語叫做阻塞。下面列舉幾種常用的程式暫停方法 input 用法 直接在欲等待處輸入input 即可。特點 優點 不需要借助模組,執行到此處阻塞等待人工輸入。缺點 程式結束時候需要強...
Python基礎之程式暫停
當我們執行某些程式時,由於機器速度很快導致肉眼無法直接看到執行結果時程式便停止執行。這時候我們迫切需要在程式中暫停,專業術語叫做阻塞。下面列舉幾種常用的程式暫停方法 input 用法 直接在欲等待處輸入input 即可。特點 優點 不需要借助模組,執行到此處阻塞等待人工輸入。缺點 程式結束時候需要強...
暫停程式 等待使用者輸入 Python使用者輸入
大多數程式都旨在解決終端使用者的問題,為此就需要獲取使用者的資訊。假如你要判斷小孩是否需要購買全價票,就需要獲取小孩的身高,這樣才能得出正確的結論。因此這種程式就需要讓使用者輸入其身高,再與規定的身高值進行比較,最後得出結果。python使用函式input 接受使用者輸入。從此刻開始,我們一起學習怎...