Python 如何阻止外部的无限循环?
考虑这种情况:我有一个类(第三方库),它的方法使用了infinity循环:Python 如何阻止外部的无限循环?,python,Python,考虑这种情况:我有一个类(第三方库),它的方法使用了infinity循环: class Worker(object): ... def transator(self): ... #if connected print data while self.connected: ... print data if __name__ == "__main__": worker = Work
class Worker(object):
...
def transator(self):
...
#if connected print data
while self.connected:
...
print data
if __name__ == "__main__":
worker = Worker()
worker.translator()
我在程序中使用这个类,不能更改。(我在github上查看了代码:))。
手动停止此方法的最佳方法是什么?我需要将self.connected更改为False以外的此方法。我有一个主意,但我觉得很复杂
import time
from threading import Thread
class Terminator(Worker):
...
def terminate(self):
time.sleep(10)
self.connected = False
if __name__ == "__main__":
ter = Terminator()
t = Tread(target=ter.terminate)
t.start()
ter.translator()
还有其他方法吗?您应该能够执行以下操作:
import time
from threading import Thread
if __name__ == "__main__":
w = Worker()
t = Thread(target=w.transator)
t.start()
time.sleep(10)
w.connected = False
t.join()
问:“如何阻止外部的无限循环”
答:阅读使用无限循环的方法/类的文档,看看是否有任何参数影响它的运行方式
对于您的用例,在我看来,您应该只能够将参数传递给
TwythonStreamer
构造函数…或者可以添加一个属性描述符,如:
def toggle_connect(self, singleton=[True]):
singleton[0] = not singleton[0]
return singleton
and after:
worker=Worker()
Worker.connected = property(toggle_connect)
我认为这个版本没有创建子类的事实使它更干净。线程是这里唯一可行的方法,所以我认为要么是这个方法,要么就是OP的方法。有了这个简单的例子,肯定不会有由于没有锁定而引起的任何并发症。光是这个词就让我感到溃疡和头痛子类化,猴子补丁,使用描述符protocoll,甚至是一个野蛮的强制但管理的异常,所有这些,但请不要线程。。。。啊,啊;-)@F.J这个版本比较干净,将来在其他项目上会对我有所帮助。但我想学习其他方法,如果它们存在的话。”我不知道猴子补丁或描述符是如何解决这个问题的。在您的回答中,
connected
属性在每次访问时都被切换,这对我来说似乎与手动将connected
属性更改为False非常不同,这正是问题所要求的。如果您需要类外的逻辑来确定何时更改该属性,那么它将必须是线程,因为使用单个线程,您将陷入循环。当然,如果库提供了一种您应该使用的方法,那么mgilson的方法(如果OP可以使其工作)是最好的。我不能真正理解您,或者我只是误解了你的意思。您所依赖的代码在github上,您不能对其进行分叉和修改吗?我很困惑@Don’我考虑过这个问题,但代码更改将比我的程序更困难:)it twython library for streaming twitter api。方法user()是无限循环,所有操作都正确,但我不能做其他任何事情。我想也许我不明白basis@DonQuestion主类| | | |附加类(内部的用户方法)| |example@DonQuestionTwythonStreamerTypes.user()使用了TwythonStreamer.\u request()_请求方法使用无限循环。我不明白应该如何使用user()方法。“我可以用键盘中断和所有这些来运行和停止它。@Sultanov:mgilson指出,Worker-“讲师”确实有一个超时参数,默认设置为不合理的高值300秒!改变它吧!;-)如果你不想依赖超时,那么我给了你一个指向替代解决方案的指针。如果你既不想超时,也不想子类化,也不想fork.thx。为了你的帮助,我会研究你的方法,这很有创新性。这只是一个起点,但也许这已经是你所需要的了。这取决于你想做什么!如果是的话,请不要急于接受我的答案,或者由米吉尔森决定哪个更适合你!;-)谢谢你的提示。我用这个参数进行了实验:如果它很小(5、10、15、20),则引发异常«««SSLError:读取操作超时»。如果是50或更多-无限循环。