Python程序暫停的正常處理方法
將進程掛起(Suspend) 而非 阻塞(Block)
如果用sleep() 進程將阻塞
假設(shè)進程下有兩個線程 那么這兩個線程會繼續(xù)運行
要使進程掛起 可以考慮使用psutil
import psutil p = psutil.Process(pid) p.suspend() #掛起進程 p.resume() #恢復(fù)進程
為了證明效果 我寫了一個簡單的進程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) #手動實現(xiàn)父類 pid = os.getpid() def run(self): print '當(dāng)前運行進程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() #計數(shù)時的互斥 計算當(dāng)前正在讀的數(shù)目 readerCount = 0 number = 0 #不滿足條件的 進入阻塞狀態(tài) class Reader(threading.Thread): #讀者 def __init__(self): threading.Thread.__init__(self) #繼承父類構(gòu)造函數(shù) 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 ,現(xiàn)在時間是 %s' %(self.name,ctime()) sleep(2) print '完成讀 , 讀者編號 %s , 現(xiàn)在時間是 %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 現(xiàn)在時間是: %s ' %(self.name,ctime()) sleep(5) print '結(jié)束寫 編號: %s 現(xiàn)在時間是 %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 '進程恢復(fù) 進程編號 %s ' %(pid) p = psutil.Process(pid) p.resume() if __name__ == '__main__': main()
結(jié)果:
當(dāng)前運行進程PID : 3096
寫者進程等待中 編號: Thread-2
開始寫 編號:Thread-2 現(xiàn)在時間是: 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
進程恢復(fù) 進程編號 3096
喚醒進程 Mon Nov 30 21:12:20 2015
結(jié)束寫 編號: Thread-2 現(xiàn)在時間是 Mon Nov 30 21:12:20 2015
寫者進程等待中 編號: Thread-2
開始讀 , 讀者編號 Thread-1 ,現(xiàn)在時間是 Mon Nov 30 21:12:20 2015
開始讀 , 讀者編號 Thread-3 ,現(xiàn)在時間是 Mon Nov 30 21:12:20 2015
開始讀 , 讀者編號 Thread-5 ,現(xiàn)在時間是 Mon Nov 30 21:12:20 2015
開始讀 , 讀者編號 Thread-7 ,現(xiàn)在時間是 Mon Nov 30 21:12:20 2015
開始讀 , 讀者編號 Thread-9 ,現(xiàn)在時間是 Mon Nov 30 21:12:20 2015
完成讀 , 讀者編號 Thread-1 , 現(xiàn)在時間是 Mon Nov 30 21:12:22 2015
完成讀 , 讀者編號 Thread-3 , 現(xiàn)在時間是 Mon Nov 30 21:12:22 2015
完成讀 , 讀者編號 Thread-5 , 現(xiàn)在時間是 Mon Nov 30 21:12:22 2015
完成讀 , 讀者編號 Thread-7 , 現(xiàn)在時間是 Mon Nov 30 21:12:22 2015
總結(jié)
以上所述是小編給大家介紹的Python程序暫停的正常處理方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
python爬蟲beautifulsoup庫使用操作教程全解(python爬蟲基礎(chǔ)入門)
這篇文章主要介紹了python爬蟲beautifulsoup庫使用操作全解(python爬蟲基礎(chǔ)入門),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02python實現(xiàn)批量獲取指定文件夾下的所有文件的廠商信息
這篇文章主要介紹了python實現(xiàn)批量獲取指定文件夾下的所有文件的廠商信息的方法,是非常實用的技巧,涉及到文件的讀寫與字典的操作等技巧,需要的朋友可以參考下2014-09-09從安裝到應(yīng)用全面掌握Python與OpenCV的配置與高級功能(最新推薦)
OpenCV的強大功能不僅限于基本的圖像處理,還可以擴展到實時視頻分析、復(fù)雜的圖像拼接和特征匹配等應(yīng)用場景,這篇文章主要介紹了從安裝到應(yīng)用全面掌握Python與OpenCV的配置與高級功能,需要的朋友可以參考下2024-08-08Python multiprocessing多進程原理與應(yīng)用示例
這篇文章主要介紹了Python multiprocessing多進程原理與應(yīng)用,結(jié)合實例形式詳細分析了基于multiprocessing包的多進程概念、原理及相關(guān)使用操作技巧,需要的朋友可以參考下2019-02-02Python使用日志模塊快速調(diào)試代碼并記錄異常信息
本文詳細介紹了Python logging日志模塊的使用方法,包括如何在代碼中使用logging記錄調(diào)試信息、如何設(shè)置日志級別、如何記錄異常信息等。通過本文的指南,讀者可以快速學(xué)會如何使用logging模塊進行調(diào)試,并保留有用的日志信息,便于后續(xù)排查問題和優(yōu)化代碼2023-04-04