欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python線程如何強(qiáng)制暫停、恢復(fù)、停止(非標(biāo)志位)

 更新時(shí)間:2024年02月18日 16:07:00   作者:夢(mèng)醒人醉  
這篇文章主要介紹了python線程如何強(qiáng)制暫停、恢復(fù)、停止(非標(biāo)志位),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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)文章

最新評(píng)論