你是ython3還是Python2?它們運(yùn)行暫停的方法也有所不同,以python3為例:
創(chuàng)新互聯(lián)建站是一家專注于網(wǎng)站制作、網(wǎng)站建設(shè)與策劃設(shè)計(jì),陸港網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:陸港等地區(qū)。陸港做網(wǎng)站價(jià)格咨詢:18980820575
1、input();
這種方法不用包含模塊,因此這也是最常用的一種暫停手段。
Python2中的raw_input()和input()語句在Python3中已經(jīng)被合并到input()中。
2、os.system("pause");
這種方法需要包含os模塊(import os),在windows下IDLE運(yùn)行會(huì)彈出cmd命令行,
進(jìn)行暫停操作,直接運(yùn)行.py文件會(huì)直接在命令行中暫停。
3、time.sleep("second");
這種方法需要包含time模塊(import time),second是自定義的時(shí)間長(zhǎng)短,根據(jù)實(shí)際情況,
您的意思是要將進(jìn)程掛起(Suspend) 而非 阻塞(Block)
如果用sleep() 進(jìn)程將阻塞
假設(shè)進(jìn)程下有兩個(gè)線程 那么這兩個(gè)線程會(huì)繼續(xù)運(yùn)行
要使進(jìn)程掛起 可以考慮使用psutil
import psutil
p = psutil.Process(pid)
p.suspend() #掛起進(jìn)程
p.resume() #恢復(fù)進(jìn)程
為了證明效果 我寫了一個(gè)簡(jiǎn)單的進(jìn)程Process
其下有兩個(gè)線程 讀者Reader 和 寫者Writer(簡(jiǎn)單的讀者寫者問題)
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) #手動(dòng)實(shí)現(xiàn)父類
pid = os.getpid()
def run(self):
print '當(dāng)前運(yùn)行進(jìn)程PID : %s ' %self.pid #子線程的id與父進(jìn)程的pid相同 屬于 同一個(gè)進(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)行時(shí)間10秒
ReaderWriter
import threading
from time import ctime, sleep
import os
mutex = threading.Lock() #互斥鎖
mutex_readercount = threading.Lock() #計(jì)數(shù)時(shí)的互斥 計(jì)算當(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)程等待中,編號(hào)%s' %(self.name)
mutex.acquire() == False # 第一個(gè)需要申請(qǐng)
mutex_readercount.release()
print '開始讀 , 讀者編號(hào) %s ,現(xiàn)在時(shí)間是 %s' %(self.name,ctime())
sleep(2)
print '完成讀 , 讀者編號(hào) %s , 現(xiàn)在時(shí)間是 %s' %(self.name,ctime())
mutex_readercount.acquire()
readerCount -= 1
if readerCount == 0: #所有讀者均完成
print '最后一個(gè)讀者完成讀 '
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)程等待中 編號(hào): %s' %(self.name)
mutex.acquire()
print '開始寫 編號(hào):%s 現(xiàn)在時(shí)間是: %s ' %(self.name,ctime())
sleep(5)
print '結(jié)束寫 編號(hào): %s 現(xiàn)在時(shí)間是 %s' %(self.name,ctime())
mutex.release()
測(cè)試程序
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)程編號(hào) %s ' %(pid)
p = psutil.Process(pid)
p.suspend()
def wake(pid):
print '進(jìn)程恢復(fù) 進(jìn)程編號(hào) %s ' %(pid)
p = psutil.Process(pid)
p.resume()
if __name__ == '__main__':
main()
結(jié)果:
當(dāng)前運(yùn)行進(jìn)程PID : 3096
寫者進(jìn)程等待中 編號(hào): Thread-2
開始寫 編號(hào):Thread-2 現(xiàn)在時(shí)間是: Mon Nov 30 21:12:12 2015
讀者進(jìn)程等待中,編號(hào)Thread-1
寫者進(jìn)程等待中 編號(hào): Thread-4
進(jìn)程阻塞
寫者進(jìn)程等待中 編號(hào): Thread-6
寫者進(jìn)程等待中 編號(hào): Thread-8
寫者進(jìn)程等待中 編號(hào): Thread-10
進(jìn)程暫停 進(jìn)程編號(hào) 3096
進(jìn)程掛起 Mon Nov 30 21:12:15 2015
進(jìn)程恢復(fù) 進(jìn)程編號(hào) 3096
喚醒進(jìn)程 Mon Nov 30 21:12:20 2015
結(jié)束寫 編號(hào): Thread-2 現(xiàn)在時(shí)間是 Mon Nov 30 21:12:20 2015
寫者進(jìn)程等待中 編號(hào): Thread-2
開始讀 , 讀者編號(hào) Thread-1 ,現(xiàn)在時(shí)間是 Mon Nov 30 21:12:20 2015
開始讀 , 讀者編號(hào) Thread-3 ,現(xiàn)在時(shí)間是 Mon Nov 30 21:12:20 2015
開始讀 , 讀者編號(hào) Thread-5 ,現(xiàn)在時(shí)間是 Mon Nov 30 21:12:20 2015
開始讀 , 讀者編號(hào) Thread-7 ,現(xiàn)在時(shí)間是 Mon Nov 30 21:12:20 2015
開始讀 , 讀者編號(hào) Thread-9 ,現(xiàn)在時(shí)間是 Mon Nov 30 21:12:20 2015
完成讀 , 讀者編號(hào) Thread-1 , 現(xiàn)在時(shí)間是 Mon Nov 30 21:12:22 2015
完成讀 , 讀者編號(hào) Thread-3 , 現(xiàn)在時(shí)間是 Mon Nov 30 21:12:22 2015
完成讀 , 讀者編號(hào) Thread-5 , 現(xiàn)在時(shí)間是 Mon Nov 30 21:12:22 2015
完成讀 , 讀者編號(hào) Thread-7 , 現(xiàn)在時(shí)間是 Mon Nov 30 21:12:22 2015
我們都知道python中可以是threading模塊實(shí)現(xiàn)多線程, 但是模塊并沒有提供暫停, 恢復(fù)和停止線程的方法, 一旦線程對(duì)象調(diào)用start方法后, 只能等到對(duì)應(yīng)的方法函數(shù)運(yùn)行完畢. 也就是說一旦start后, 線程就屬于失控狀態(tài). 不過, 我們可以自己實(shí)現(xiàn)這些. 一般的方法就是循環(huán)地判斷一個(gè)標(biāo)志位, 一旦標(biāo)志位到達(dá)到預(yù)定的值, 就退出循環(huán). 這樣就能做到退出線程了. 但暫停和恢復(fù)線程就有點(diǎn)難了, 我一直也不清除有什么好的方法