如何随意停止和启动线程

时间:2018-08-18 18:37:51

标签: python multithreading python-3.6

因此,我正在对线程进行一些测试,我意识到无法停止然后再启动线程。我可以停止它,但是再次开始是问题。

我想要一个脚本,该脚本在var打开时将1加到var,然后在关闭时通过按shift打开和关闭它而停止。< br />我正在检测移位(在代码的另一部分中),但是我只需要了解如何停止和启动线程

这是我的测试代码:

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)

我知道有一些错误,但是我主要需要打开和关闭线程来工作。 谢谢杰夫。

4 个答案:

答案 0 :(得分:1)

据我所知,当方法终止时,您实际上无法停止并重新启动线程,因为您无法使用test.start()。但是,您可能想知道类似的事情,可以使用threading.Condition暂停并稍后恢复执行。

您可以在documentation中详细了解它。

var += 1:中也存在错误,请将其更改为var += 1

答案 1 :(得分:0)

这是一个简单的示例,说明如何使用threading.Event来使两个线程进行通信。通过将事件的内部标志设置为True或False,可以工作。当此内部标志为False时,您可以请求线程await(有效地阻塞,这并不是很有效)。然后,我们使用两个计时器(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()

答案 2 :(得分:0)

您无法重新启动已经启动的线程。但是,您可以做的是创建另一个线程。

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)

答案 3 :(得分:0)

使用event object之类的this post,然后在目标函数中检查该事件。另外,您need a new thread each time you re-start。下面显示的代码添加了一些有用的调试信息。 (另一种方法是构建custom stop function。)

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)