您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python程序暫停的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
將進程掛起(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 import 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): 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:22 2015
關于“Python程序暫停的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。