Python Threading:使线程函数从外部信号返回



谁能指出这段代码有什么问题?我试图通过一个变量标志返回线程,我想在主线程中控制它。

<标题> test27.py h1> test28.py h1> div class="one_answers">

Thread类可以用target参数实例化。然后给它一个应该在新线程中执行的函数。这是一种方便的方式来启动一个简单的线程,但为了更多的控制,通常更容易从Thread继承一个类,它有额外的成员变量,像flag中止。

例如:

import time
import threading
class MyThread(threading.Thread):
    def __init__(self, x, y):
        super().__init__()
        # or in Python 2:
        # super(MyThread, self).__init__()
        self.x = x
        self.y = y
        self._stop_requested = False
    def run(self):
        while not self._stop_requested:
            z = self.x + self.y
            w = self.x - self.y
            print (z * w)
            time.sleep(1)
    def stop(self, timeout=None):
        self._stop_requested = True
        self.join(timeout)

然后,启动线程,调用start(),然后停止它调用stop():

>>> def run_thread_for_5_seconds():
...     t = MyThread(3, 4)
...     t.start()
...     time.sleep(5)
...     t.stop()
...
>>> run_thread_for_5_seconds()
-7
-7
-7
-7
-7
>>>

常规变量不应该在线程中被跟踪。这样做是为了防止竞态状态。必须使用线程安全的构造在线程之间进行通信。对于一个简单的标志,使用threading.Event。此外,您不能通过线程对象访问局部变量flag。它是局部的,只能从作用域中看到。你必须使用全局变量,就像我下面的例子一样,或者在调用线程之前创建一个对象,并使用成员变量。

from threading import Event
flag = Event()
def Read(x,y):
    global flag
    flag.clear()
    ...
    if flag.is_set():
        return

主线程:

sleep(5)
flag.set()

注:我刚刚注意到你试图在线程中使用lock(),但未能在主线程中使用它。对于一个简单的标志,使用Event。对于lock(),您需要锁定这两个部分并降低死锁的风险。

最新更新