谁能指出这段代码有什么问题?我试图通过一个变量标志返回线程,我想在主线程中控制它。
<标题> 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(),您需要锁定这两个部分并降低死锁的风险。