Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-在基于属性更改的方法中停止while循环_Python_Loops_Oop - Fatal编程技术网

Python-在基于属性更改的方法中停止while循环

Python-在基于属性更改的方法中停止while循环,python,loops,oop,Python,Loops,Oop,我有一个非常简单的类,只有一个属性和一个方法。我希望该方法基于属性的值运行。以下是课程代码: class TestWhile() def __init__(self): self.status = "OFF" def StreamV(self): while self.Status == "ON" print "nonstop" 基本上,我想做的是将Status设置为ON,然后运行StreamV,直到Status设置为off。以下是我想要的

我有一个非常简单的类,只有一个属性和一个方法。我希望该方法基于属性的值运行。以下是课程代码:

class TestWhile()
   def __init__(self):
      self.status = "OFF"
   def StreamV(self):
      while self.Status == "ON"
         print "nonstop"
基本上,我想做的是将Status设置为ON,然后运行StreamV,直到Status设置为off。以下是我想要的:

P = TestWhile()
T.Status = "ON"
T.StreamV()
T.Status = "OFF"

当我运行上面的测试时,它从未到达Status=“OFF”行并无限地运行循环。如何修复此问题?

您对
T.StreamV()
的调用会执行通常所称的操作并阻塞主线程。您已经有效地描述了您想要的是一个后台线程来更新某些值,直到收到一个信号(来自
T.Status
属性)

对于简单的问题,线程是相对容易处理的,并且是一个非常有用的工具。从超宽的角度来看,python中的线程是一个可以在主脚本执行其他操作的同时运行的函数。在这方面,python线程实际上是通过向它们传递一个要执行的函数来创建的

例如:

导入线程
导入时间
类TestWhile(对象):
定义初始化(自):
self.status=“关闭”
self.streamVthread=threading.Thread(target=self.StreamV)#为StreamV函数创建一个线程
def StreamV(自):
打印“起始线程”
而self.Status==“开”:
打印“不间断”
时间。睡眠(1)
打印“停止线程”
T=TestWhile()#我们的线程实际上是在这里创建的,但尚未启动
打印'T.Status->“ON”'
T.Status=“ON”#T.StreamV可以修改为在创建时运行,并等待其更改为“ON”
T.streamVthread.start()#这将在单独的线程中调用T.StreamV函数
时间。睡眠(6)
T.Status=“关闭”
打印“T.Status->“OFF”
我添加了一系列打印语句来帮助您理解程序流程。请评论任何问题

编辑:将参数传递给线程

线程与主线程位于同一名称空间中,因此如果它们与主脚本共享一个变量,则它们都可以访问该变量。这可能会导致多个线程同时访问同一事物时出现问题(请阅读更多)。但是,在创建线程时传递参数可以这样做:

导入线程
导入时间
def sayHello(秒后,姓名):
睡眠时间(秒后)
打印(“hello from{}”。格式(名称))
thread1=threading.Thread(target=sayHello,args=(3,“thread1”))
thread2=threading.Thread(target=sayHello,args=(1,“thread2”))
thread3=threading.Thread(target=sayHello,args=(5,“thread3”))
打印“起始线程1”
thread1.start()
打印“起始线程2”
thread2.start()
打印“起始线程3”
thread3.start()
thread1.join()#等待thread1完成
打印“线程1已完成”
thread2.join()#等待thread2完成
打印“线程2已完成”
thread3.join()#等待thread3完成
打印“线程3已完成”

查看是否可以确定这些打印语句按顺序发生的原因。

您对
T.StreamV()
的调用执行通常所称的操作并阻塞主线程。您已经有效地描述了您想要的是一个后台线程来更新某些值,直到收到一个信号(来自
T.Status
属性)

对于简单的问题,线程是相对容易处理的,并且是一个非常有用的工具。从超宽的角度来看,python中的线程是一个可以在主脚本执行其他操作的同时运行的函数。在这方面,python线程实际上是通过向它们传递一个要执行的函数来创建的

例如:

导入线程
导入时间
类TestWhile(对象):
定义初始化(自):
self.status=“关闭”
self.streamVthread=threading.Thread(target=self.StreamV)#为StreamV函数创建一个线程
def StreamV(自):
打印“起始线程”
而self.Status==“开”:
打印“不间断”
时间。睡眠(1)
打印“停止线程”
T=TestWhile()#我们的线程实际上是在这里创建的,但尚未启动
打印'T.Status->“ON”'
T.Status=“ON”#T.StreamV可以修改为在创建时运行,并等待其更改为“ON”
T.streamVthread.start()#这将在单独的线程中调用T.StreamV函数
时间。睡眠(6)
T.Status=“关闭”
打印“T.Status->“OFF”
我添加了一系列打印语句来帮助您理解程序流程。请评论任何问题

编辑:将参数传递给线程

线程与主线程位于同一名称空间中,因此如果它们与主脚本共享一个变量,则它们都可以访问该变量。这可能会导致多个线程同时访问同一事物时出现问题(请阅读更多)。但是,在创建线程时传递参数可以这样做:

导入线程
导入时间
def sayHello(秒后,姓名):
睡眠时间(秒后)
打印(“hello from{}”。格式(名称))
thread1=threading.Thread(target=sayHello,args=(3,“thread1”))
thread2=threading.Thread(target=sayHello,args=(1,“thread2”))
thread3=threading.Thread(target=sayHello,args=(5,“thread3”))
打印“起始线程1”
thread1.start()
打印“起始线程2”
thread2.start()
打印“起始线程3”
thread3.start()
thread1.join()#等待thread1完成
打印“线程1已完成”
thread2.join()#等待thread2完成
打印“线程2已完成”
thread3.join()#等待thread3完成
打印“线程3已完成”

看看你是否能确定这些打印语句为什么会按顺序出现。

y'all需要在此处出现,除非你想办法让while循环打开
self.Sstatus='OFF'
你可能需要执行线程。我如何执行线程?除非你想办法让while循环打开
self.Sstatus=“关闭”
yo