Python 如何阻止外部的无限循环?

Python 如何阻止外部的无限循环?,python,Python,考虑这种情况:我有一个类(第三方库),它的方法使用了infinity循环: class Worker(object): ... def transator(self): ... #if connected print data while self.connected: ... print data if __name__ == "__main__": worker = Work

考虑这种情况:我有一个类(第三方库),它的方法使用了infinity循环:

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或更多-无限循环。