如果在此之前没有返回
,我想做的就是超时一个函数这一切都开始了,因为urllib2支持urlopen
的超时,但不支持读取部分
我的程序挂了。更改套接字defaulttimeout
不起作用。使用signal.sigalrm
不起作用。我无法切换到请求,因为那时我将不得不重写和测试更多。
我不想让一个线程运行该函数然后超时该线程,我想超时该函数。有什么想法吗?
答案 0 :(得分:0)
我喜欢在我的项目中使用David的班级here。我发现它非常有效,我喜欢它提供了一种通过装饰器在现有代码中实现的简单方法。例如:
# Timeout after 30 seconds
@timeout(30)
def your_function():
...
注意:这是不线程安全!如果您正在使用多线程,则该信号将被随机线程捕获。但是对于单线程程序,这是最简单的解决方案。
答案 1 :(得分:0)
是的,它可以在没有信号的窗口中完成,也可以在其他操作系统中使用。这是使用线程,而不是运行函数,而是发出超时信号。逻辑是创建一个新线程并等待给定时间并使用_thread(在python3中为python2中的线程)引发异常。如果发生任何异常,将在主线程中抛出该异常,并且with块将退出。
library(reshape2)
library(ggplot2)
set.seed(123)
#Dummy data
Numvars <- as.data.frame(matrix(rnorm(1000*300),nrow = 1000,ncol = 300))
vec1 <- 1:1000
vec2 <- rep(paste0('class',1:5),200)
IDs <- data.frame(vec1,vec2,stringsAsFactors = F)
#Bind data
Data <- cbind(IDs,Numvars)
#Select vars (in your case 10 initial vars)
df <- Data[,1:12]
#Prepare for plot
df.melted <- melt(data = df,id.vars = c('vec1','vec2'))
#Plot
ggplot(df.melted,aes(x=vec1,y=value,group=variable,color=variable))+
geom_line()+
facet_wrap(~vec2)
用法示例:-
import threading
import _thread # import thread in python2
class timeout():
def __init__(self, time):
self.time= time
self.exit=False
def __enter__(self):
threading.Thread(target=self.callme).start()
def callme(self):
time.sleep(self.time)
if self.exit==False:
_thread.interrupt_main() # use thread instead of _thread in python2
def __exit__(self, a, b, c):
self.exit=True
with块中的程序应在2秒内退出,否则它将在2秒后退出。