簡體   English   中英

如何暫停和恢復Python線程

[英]How to pause and resume Python threading.Timer

在python中, threading.Timer可以在一段時間后正常執行函數。 但是沒有暫停或繼續功能。 還有其他方法嗎?

需要這樣的東西。

from threading import Timer
from time import sleep
def Hello():
    print "hello"
t=Timer(10, Hello)
t.start()
sleep(3)
### <Pause Timer t>
### <do some work>
### <Resume Timer t>

如果知道定時器已啟動多少時間或還剩多少時間,這也將很有幫助。 因此,可以執行以下操作:

### x =  Time passed by Timer t
### t.cancel()
### <do some work>
### t=Timer(10-x, Hello)
### t.start()

編輯1:

這是我在vitaut回答后的代碼:

## My Timer Class ##

from threading import Timer as threadTimer
from time import time, sleep
from random import randint as rint

class MyTimer:

    def __init__(self, key, delete):
        self.startTime = time()
        self.timer = threadTimer(15, delete, args=[key])
        self.timer.start()
    def pause(self):
        self.timer.cancel()
        self.endTime = time()
    def resume(self, delete, key):
        self.timer = threadTimer(15-(self.endTime-self.startTime), delete, args=[key])
        self.timer.start()
    def cancel(self):
        self.timer.cancel()

我正在使用以下代碼進行測試:

class MyClass:

    def __init__(self):
        self.dict={}

    def delete(self, key):
        print key, time()-self.dict[key]["stime"]
        self.dict[key]["timer"]=None
        self.dict[key]=None
        del self.dict[key]

    def doSomeWork(self, key):
        for i in xrange(10):
            x=str(rint(0,3))
            if self.dict.has_key(key):
                self.dict[key]["timer"].pause()
                print key,
                sleep(1)
                self.dict[key]["timer"].resume(self.delete, key)
        print

    def createDict(self):
        print "Pausing Timer for 1 second for ",
        for i in xrange(10):
            self.dict[i]={}
            self.dict[i]["timer"]=MyTimer(key, self.delete)
            self.dict[i]["stime"]=time()

x=MyClass()
x.createDict()
x.doSomeWork()

輸出:

Pausing Timer for 1 second for  0 1 0 2 1 0 2 1 1 0
3 15.0000641346
4 15.0000319481
5 15.0000360012
6 15.0000460148
7 15.0002529621
8 15.0000050068
9 15.0001029968
0 16.000754118
2 16.0007479191
1 16.0011930466

由於它會用鍵1暫停Timer每次4次,持續1秒。 因此,1的最終時間應為19+秒(預期)。 但是它只顯示16。

AFAIK Timer類沒有暫停/繼續功能,但是您可以通過start / cancel輕松地模擬它,並跟蹤自己啟動計時器的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM