1. 程式人生 > 程式設計 >Python程式暫停的正常處理方法

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 '完成讀,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程式暫停的正常處理方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!