簡體   English   中英

如何隨意停止和啟動線程

[英]How to stop and start a thread at will

因此,我正在對線程進行一些測試,我意識到無法停止然后再啟動線程。 我可以停止它,但是再次開始是問題。

我想要一個腳本,該腳本在打開時將1加到var,然后在關閉時通過按shift打開和關閉它而停止。
我正在檢測輪班工作(在代碼的另一部分中),但是我只需要了解如何停止和啟動線程

這是我的測試代碼:

from threading import Thread as th
import time as t
var = 0
def testDef():
    global var
    var += 1:
    t.sleep(1)
test = th(target = testDef)
test.start()
while True:
    menu = input("On, Off, Show Var")
    if menu == "On":
        test.start()
    elif menu == "Off":
        test._stop():
    elif menu == "S":
        print(var)

我知道有一些錯誤,但是我主要需要打開和關閉線程才能工作。 謝謝,傑夫。

據我所知,當方法終止時,您實際上不能停止並重新啟動線程,因為您不能使用test.start() 但是,您可能想知道通過使用threading.Condition來暫停並稍后恢復執行的類似操作。

您可以在文檔中閱讀有關它的更多信息。

var += 1:也存在錯誤,請將其更改為var += 1

這是一個有關如何使用threading.Event來使兩個線程進行通信的簡單示例。 通過將事件的內部標志設置為True或False,可以工作。 當此內部標志為False您可以要求線程a wait (有效地阻塞,這並不是很有效)。 然后,我們使用兩個計時器(b, c)每隔5秒模擬一次換檔。 為了釋放a事件,我們set了事件(內部標志= True)。 5秒后,我們clear內部標志的值,這將使線程a再次阻塞。

import threading

def do(event):
    flag = True
    while flag:
        if not event.isSet():
            print "blocking"
            event.wait()
        else:
            print "resuming"


def pressShift(event, enable):
    print "Shift pressed"
    if enable:
        event.set()
    else:
        event.clear()

def main():
    event = threading.Event()
    a = threading.Thread(target=do, args=(event,))
    b = threading.Timer(5, pressShift, args=(event, True)).start()
    c = threading.Timer(10, pressShift, args=(event, False)).start()
    a.start()
    a.join()

if __name__ == "__main__":
    main()

您無法重新啟動已經啟動的線程。 但是,您可以做的是創建另一個線程。

from threading import Thread as th
import time as t
var = 0
def testDef():
    global var
    var += 1
    t.sleep(1)
test = th(target = testDef)
test.start()
while True:
    menu = input("On, Off, Show Var")
    if menu == "On":
        test = th(target = testDef)
        test.start()
    elif menu == "Off":
        test._stop()
    elif menu == "S":
        print(var)

使用類似於此post事件對象 ,並在目標functoin中檢查該事件。 另外, 每次重新啟動時需要一個新線程 下面顯示的代碼添加了一些有用的調試信息。 (另一種方法是構建自定義停止功能 。)

import logging
import threading
import time as t
var = 0

logging.basicConfig(level=logging.DEBUG,
                    format='[%(levelname)s] (%(threadName)-10s) %(message)s',
                    )

def testDef(stop_event):
    global var
    print 'Thread Running', var
    # inThread.stop()
    while not stop_event.isSet():
        var += 1
        logging.debug('Var is %i' % var) 
        t.sleep(1)

# Use an event to track user input
testStopEvent = threading.Event()
testStopEvent.clear()

test = threading.Thread(name = 'test', target=testDef, args=((testStopEvent,)))
test.setDaemon(True)
while True:
    menu = input("On = 1, Off = 2, Show Var = 3")
    if menu == 1:
        test.start()
    elif menu == 2:
        testStopEvent.set()
        test.join() # Wait for the thread to finish
        test = threading.Thread(target=testDef, args=((testStopEvent,))) # "re-start" thread
        testStopEvent.clear() # Reset the stop event

    elif menu == 3:
        print(var)

暫無
暫無

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

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