Python程式暫停的正常處理方法

2022-10-03 18:39:11 字數 4167 閱讀 5065

將程序掛起(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 接受使用者輸入。從此刻開始,我們一起學習怎...