Python程式暫停的正常處理方法
阿新 • • 發佈:2020-01-09
將程序掛起(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 '完成讀,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,讀者編號 Thread-5,讀者編號 Thread-7,讀者編號 Thread-9,現在時間是 Mon Nov 30 21:12:20 2015
完成讀,現在時間是 Mon Nov 30 21:12:22 2015
完成讀,現在時間是 Mon Nov 30 21:12:22 2015
總結
以上所述是小編給大家介紹的Python程式暫停的正常處理方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!