Python程序暫停的正常處理方法
將進(jìn)程掛起(Suspend) 而非 阻塞(Block)
如果用sleep() 進(jìn)程將阻塞
假設(shè)進(jìn)程下有兩個線程 那么這兩個線程會繼續(xù)運(yùn)行
要使進(jìn)程掛起 可以考慮使用psutil
import psutil p = psutil.Process(pid) p.suspend() #掛起進(jìn)程 p.resume() #恢復(fù)進(jìn)程
為了證明效果 我寫了一個簡單的進(jìn)程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)前運(yùn)行進(jìn)程PID : %s ' %self.pid #子線程的id與父進(jìn)程的pid相同 屬于 同一個進(jìn)程
for i in range(0,5):
r = ThreadInReadAndWriteProblem.Reader()
w = ThreadInReadAndWriteProblem.Writer()
w.start()
r.start()
print '進(jìn)程阻塞'
sleep(10) #總共運(yùn)行時間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
#不滿足條件的 進(jìn)入阻塞狀態(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 '讀者進(jìn)程等待中,編號%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 '寫者進(jìn)程等待中 編號: %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 '進(jìn)程掛起 %s' %ctime()
sleep(5)
wake(p.pid)
print '喚醒進(jìn)程 %s' %ctime()
def stop(pid):
print '進(jìn)程暫停 進(jìn)程編號 %s ' %(pid)
p = psutil.Process(pid)
p.suspend()
def wake(pid):
print '進(jìn)程恢復(fù) 進(jìn)程編號 %s ' %(pid)
p = psutil.Process(pid)
p.resume()
if __name__ == '__main__':
main()
結(jié)果:
當(dāng)前運(yùn)行進(jìn)程PID : 3096
寫者進(jìn)程等待中 編號: Thread-2
開始寫 編號:Thread-2 現(xiàn)在時間是: Mon Nov 30 21:12:12 2015
讀者進(jìn)程等待中,編號Thread-1
寫者進(jìn)程等待中 編號: Thread-4
進(jìn)程阻塞
寫者進(jìn)程等待中 編號: Thread-6
寫者進(jìn)程等待中 編號: Thread-8
寫者進(jìn)程等待中 編號: Thread-10
進(jìn)程暫停 進(jìn)程編號 3096
進(jìn)程掛起 Mon Nov 30 21:12:15 2015
進(jìn)程恢復(fù) 進(jìn)程編號 3096
喚醒進(jìn)程 Mon Nov 30 21:12:20 2015
結(jié)束寫 編號: Thread-2 現(xiàn)在時間是 Mon Nov 30 21:12:20 2015
寫者進(jìn)程等待中 編號: 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使用logging實現(xiàn)多進(jìn)程安全的日志模塊
這篇文章主要為大家詳細(xì)介紹了Python如何使用標(biāo)準(zhǔn)庫logging實現(xiàn)多進(jìn)程安全的日志模塊,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2024-01-01
Python參數(shù)傳遞機(jī)制傳值和傳引用原理詳解
這篇文章主要介紹了Python參數(shù)傳遞機(jī)制傳值和傳引用原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05
python實現(xiàn)自動登錄人人網(wǎng)并采集信息的方法
這篇文章主要介紹了python實現(xiàn)自動登錄人人網(wǎng)并采集信息的方法,涉及Python模擬登陸及正則匹配的相關(guān)技巧,需要的朋友可以參考下2015-06-06
python numpy 反轉(zhuǎn) reverse示例
今天小編就為大家分享一篇python numpy 反轉(zhuǎn) reverse示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Django?+?Taro?前后端分離項目實現(xiàn)企業(yè)微信登錄功能
這篇文章主要介紹了Django?+?Taro?前后端分離項目實現(xiàn)企業(yè)微信登錄功能,本文記錄一下企業(yè)微信登錄的流程,結(jié)合示例代碼給大家分享實現(xiàn)思路,需要的朋友可以參考下2022-04-04
python 調(diào)用pyautogui 實時獲取鼠標(biāo)的位置、移動鼠標(biāo)的方法
今天小編就為大家分享一篇python 調(diào)用pyautogui 實時獲取鼠標(biāo)的位置、移動鼠標(biāo)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
CentOS 7下安裝Python 3.5并與Python2.7兼容并存詳解
這篇文章主要給大家介紹了在CentOS 7下安裝Python 3.5并與Python2.7兼容并存的相關(guān)資料,文中將安裝步驟介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07

