我在网上找到了一些关于超时运行代码的讨论和活动模式。看起来有一些常见的方法:
使用运行代码的线程,并使用带有超时的join。如果超时时间已过-终止线程。这在python(使用的私有_Thread__stop函数)中不直接支持,因此这是不好的做法。
使用signal.SIGALRM—但这种方法不适用于Windows!
使用带有超时的子进程-但这太重了-如果我想经常启动可中断的任务,我不希望为每个任务都触发进程怎么办!
那么,正确的方法是什么?我不是在问解决方法(例如使用Twisted和AsyncIO),而是实际解决实际问题的方法——我有一些函数,我只想在超时的情况下运行它。如果超时时间已过,我希望控制权恢复。我希望它能在Linux和Windows上工作。
杀死一个代码是一个糟糕的实践,但如果你想这样做,线程是最好的方法。
我假设您不能修改相关代码?
@当然不能。否则我不会问的。
我认为扭曲不是解决方法,而是解决方法。
你能准确地说你在做什么吗?你运行的代码是什么?
没有正确的方法,这取决于你打断了什么,它保持了什么共享状态,等等。
这取决于你的算法,如果它是迭代的,你可以放弃控制权,如果它是IO,你可以select等等…
@本杰明:只是好奇而已。代码实际上使用套接字调用。目前,我可能会切换到Twisted,但想知道是否可以改为超时。切换到Twisted只是为了超时是很遗憾的
我认为thread的stop函数被贬低了,有利于中断线程并自己处理对线程的杀戮。扼杀一根线并不是一个坏习惯。
@皮佩普:你是怎么自杀的?
@zaharpoov只返回线程的run函数。
同上,@无用,完全取决于你想做什么。
一个完全通用的解决方案,真的,真的不存在。对于给定的域,必须使用正确的解决方案。
如果你想让你完全控制的代码超时,你必须写它来合作。这种代码必须能够以某种方式分解成小块,比如在事件驱动系统中。如果您可以确保没有什么东西能将锁保持太长时间,那么您也可以通过线程来实现这一点,但正确处理锁实际上相当困难。
如果您因为担心代码失控而需要超时(例如,如果您担心用户会要求计算器计算9**(9**9)),则需要在另一个进程中运行它。这是唯一能够充分隔离它的简单方法。在事件系统或其他线程中