簡體   English   中英

Python暫停線程,手動執行並重置時間

[英]Python pause thread, do manually and reset time

我需要每隔x秒調用一次函數,但可以選擇手動調用該函數,在這種情況下需要重置時間。 我有這樣的事情:

import time
import threading

def printer():
    print("do it in thread")

def do_sth(event):
    while not event.is_set():
        printer()
        time.sleep(10)

event = threading.Event()
print("t - terminate, m - manual")
t = threading.Thread(target=do_sth, args=(event,))
t.daemon = True
t.start()
a = input()
if a == 't':
    event.set()
elif a == 'm':
    event.wait()
    printer()
    event.clear()

更新:我發現了一些對我有很大幫助的東西: Python-我可以暫停和恢復的線程現在我的代碼如下:

import threading, time, sys

class ThreadClass(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)
        self.can_run = threading.Event()
        self.thing_done = threading.Event()
        self.thing_done.set()
        self.can_run.set()

    def run(self):
        while True:
            self.can_run.wait()
            try:
                self.thing_done.clear()
                self.do_in_thread()
            finally:
                self.thing_done.set()
            time.sleep(5)

    def pause(self):
        self.can_run.clear()
        self.thing_done.wait()

    def resume(self):
        self.can_run.set()

    def do_in_thread(self):
        print("Thread...1")
        time.sleep(2)
        print("Thread...2")
        time.sleep(2)
        print("Thread...3")


def do_in_main():
    print("Main...1")
    time.sleep(2)
    print("Main...2")
    time.sleep(2)
    print("Main...3")

if __name__ == '__main__':

    t = ThreadClass()
    t.daemon = True
    t.start()
    while True:
        i = input()
        if i == 'm':
            t.pause()
            do_in_main()
            t.resume()
        elif i == 't':
            sys.exit()
            # t.join()

唯一的問題是,當我終止時,一個希望線程在退出之前完成其工作。

緩沖的輸出可能是罪魁禍首,因此-您正在得到預期的行為。

我將您的代碼更改為以下代碼,它似乎可以執行某些操作(如果這正是您想要的,則取決於您):

import time
import threading

def printer():
    print("do it in thread")

def do_sth(event):
    print("event.is_set:", event.is_set())
    while not event.is_set():
        printer()
        time.sleep(10)

event = threading.Event()
print("t - terminate, m - manual")
t = threading.Thread(target=do_sth, args=(event,))
print("t:",t)
t.daemon = True
t.start()
a = input()
if a == 't':
    event.set()
elif a == 'm':
    event.wait()
    printer()
    event.clear()

暫無
暫無

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

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