python線程如何強制暫停、恢復、停止(非標志位)
python線程強制暫停、恢復、停止(非標志位)
查了好多資料,網(wǎng)上無非都是通過event 標志位進行python線程的暫停和停止。
并不是強制暫停和恢復線程。
直接上代碼吧
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程序能夠任意時刻暫停和恢復
需求
要讓一個運行中的程序可以在任意時刻被我們暫停并且恢復后能恢復到暫停前的狀態(tài)
解決方案
利用os讀取文件的方式來實現(xiàn)程序的控制
測試實例:
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來使用配置文件來實現(xiàn),當需要暫停時修改配置文件中的值來實現(xiàn)暫停。這種方案的優(yōu)點在于可以修改運行過程中的變量值
配置文件testConfig.ini
[config] pause = false
實現(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模塊讀取文件來實現(xiàn)
文本文檔pause.txt
false
實現(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微秒
作者的話
這其實是一種討巧的方法,這只適合自己使用腳本來用,生產(chǎn)上還是要用多線程的方法來實現(xiàn),不過你要是對于python高級編程不夠嫻熟,那么可以看看我的這種方法,也算給大家提供一個思路。
你要是說想實現(xiàn)命令行中輸入任意暫停,可以再寫個專門用來修改文本的python腳本打開,這其實就是一種另類的多線程,你要是覺得麻煩也能多線程實現(xiàn)這兩種功能,一個線程為工作線程,一個線程為修改文件線程。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python利用matplotlib繪制約數(shù)個數(shù)統(tǒng)計圖示例
這篇文章主要介紹了Python利用matplotlib繪制約數(shù)個數(shù)統(tǒng)計圖,結(jié)合實例形式詳細分析了Python使用matplotlib進行統(tǒng)計圖繪制的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11
python flask服務(wù)端響應(yīng)與重定向處理各種用法小結(jié)
這篇文章主要介紹了python flask服務(wù)端響應(yīng)與重定向處理各種用法小結(jié),本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-03-03
Pytorch中torch.repeat_interleave()函數(shù)使用及說明
這篇文章主要介紹了Pytorch中torch.repeat_interleave()函數(shù)使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
python實現(xiàn)自動發(fā)送報警監(jiān)控郵件
這篇文章主要為大家詳細介紹了python實現(xiàn)自動發(fā)送報警監(jiān)控郵件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06

