python線程如何強(qiáng)制暫停、恢復(fù)、停止(非標(biāo)志位)
python線程強(qiáng)制暫停、恢復(fù)、停止(非標(biāo)志位)
查了好多資料,網(wǎng)上無(wú)非都是通過(guò)event 標(biāo)志位進(jìn)行python線程的暫停和停止。
并不是強(qiáng)制暫停和恢復(fù)線程。
直接上代碼吧
import threading import ctypes class CustomThread(threading.Thread): def __init__(self, target=None, args=(), kwargs=None, name=''): threading.Thread.__init__(self, target=target, args=args, kwargs=kwargs, name=name) self.kernel32 = ctypes.windll.kernel32 self.thread_flag = 0 def stop(self): ctypes.pythonapi.PyThreadState_SetAsyncExc(self.ident, ctypes.py_object(SystemExit)) self.thread_flag = 0 return self.thread_flag def start(self): threading.Thread.start(self) return def pause(self): handle = self.kernel32.OpenThread(0x0002, False, self.ident) self.kernel32.SuspendThread(handle) self.kernel32.CloseHandle(handle) self.thread_flag += 1 return self.thread_flag def resume(self): handle = self.kernel32.OpenThread(0x0002, False, self.ident) self.kernel32.ResumeThread(handle) self.kernel32.CloseHandle(handle) self.thread_flag -= 1 return self.thread_flag
讓python程序能夠任意時(shí)刻暫停和恢復(fù)
需求
要讓一個(gè)運(yùn)行中的程序可以在任意時(shí)刻被我們暫停并且恢復(fù)后能恢復(fù)到暫停前的狀態(tài)
解決方案
利用os讀取文件的方式來(lái)實(shí)現(xiàn)程序的控制
測(cè)試實(shí)例:
import datetime starttime = datetime.datetime.now() for i in range(2000): print("第%d次循環(huán)"%i) endtime = datetime.datetime.now() print ('相差:%s秒'%(endtime-starttime).seconds) print ('相差:%s微秒'%(endtime-starttime).microseconds)
- 相差:13秒
- 相差:332692微秒
解決方案一
利用configparser來(lái)使用配置文件來(lái)實(shí)現(xiàn),當(dāng)需要暫停時(shí)修改配置文件中的值來(lái)實(shí)現(xiàn)暫停。這種方案的優(yōu)點(diǎn)在于可以修改運(yùn)行過(guò)程中的變量值
配置文件testConfig.ini
[config] pause = false
實(shí)現(xiàn)
import configparser import datetime cf = configparser.ConfigParser() starttime = datetime.datetime.now() for i in range(2000): cf.read("testConfig.ini") pause = cf.getboolean("config", "pause") print("第%d次循環(huán)"%i) if pause: os.system("pause") endtime = datetime.datetime.now() print ('相差:%s秒'%(endtime-starttime).seconds) print ('相差:%s微秒'%(endtime-starttime).microseconds)
- 相差:13秒
- 相差:866351微秒
解決方案二
利用os模塊讀取文件來(lái)實(shí)現(xiàn)
文本文檔pause.txt
false
實(shí)現(xiàn)
import os import datetime starttime = datetime.datetime.now() for i in range(2000): f = open('pause.txt','r',encoding='utf-8') sttr = f.readline() print("第%d次循環(huán)"%i) if sttr =='true': os.system("pause") endtime = datetime.datetime.now() print ('相差:%s秒'%(endtime-starttime).seconds) print ('相差:%s微秒'%(endtime-starttime).microseconds)
- 相差:13秒
- 相差:360924微秒
作者的話
這其實(shí)是一種討巧的方法,這只適合自己使用腳本來(lái)用,生產(chǎn)上還是要用多線程的方法來(lái)實(shí)現(xiàn),不過(guò)你要是對(duì)于python高級(jí)編程不夠嫻熟,那么可以看看我的這種方法,也算給大家提供一個(gè)思路。
你要是說(shuō)想實(shí)現(xiàn)命令行中輸入任意暫停,可以再寫個(gè)專門用來(lái)修改文本的python腳本打開,這其實(shí)就是一種另類的多線程,你要是覺得麻煩也能多線程實(shí)現(xiàn)這兩種功能,一個(gè)線程為工作線程,一個(gè)線程為修改文件線程。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python工具快速為音視頻自動(dòng)生成字幕(使用說(shuō)明)
這篇文章主要介紹了python工具快速為音視頻自動(dòng)生成字幕(使用說(shuō)明),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Python利用matplotlib繪制約數(shù)個(gè)數(shù)統(tǒng)計(jì)圖示例
這篇文章主要介紹了Python利用matplotlib繪制約數(shù)個(gè)數(shù)統(tǒng)計(jì)圖,結(jié)合實(shí)例形式詳細(xì)分析了Python使用matplotlib進(jìn)行統(tǒng)計(jì)圖繪制的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11python flask服務(wù)端響應(yīng)與重定向處理各種用法小結(jié)
這篇文章主要介紹了python flask服務(wù)端響應(yīng)與重定向處理各種用法小結(jié),本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03Pytorch中torch.repeat_interleave()函數(shù)使用及說(shuō)明
這篇文章主要介紹了Pytorch中torch.repeat_interleave()函數(shù)使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01python opencv 圖像拼接的實(shí)現(xiàn)方法
高級(jí)圖像拼接也叫作基于特征匹配的圖像拼接,拼接時(shí)消去兩幅圖像相同的部分,實(shí)現(xiàn)拼接合成全景圖。這篇文章主要介紹了python opencv 圖像拼接,需要的朋友可以參考下2019-06-06python 計(jì)算積分圖和haar特征的實(shí)例代碼
今天小編就為大家分享一篇python 計(jì)算積分圖和haar特征的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11python實(shí)現(xiàn)自動(dòng)發(fā)送報(bào)警監(jiān)控郵件
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)自動(dòng)發(fā)送報(bào)警監(jiān)控郵件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06