Python中处理超时异常的方法有多种,下面是一些常见的解决方案:
使用装饰器
你可以使用装饰器来限制函数的运行时间。例如,`timeout_decorator`库允许你为函数设置一个超时时间。
```python
import time
from timeout_decorator import timeout
@timeout(6) 设置超时时间为6秒
def justtest():
time.sleep(5)
return 5
aaa = justtest()
print(aaa) 如果函数运行时间超过6秒,将抛出异常
设置全局默认超时时间
使用`socket.setdefaulttimeout()`可以设置全局默认超时时间,这样所有使用`socket`的函数都会受到这个设置的影响。
```python
import socket
socket.setdefaulttimeout(10) 设置超时时间为10秒
try:
f = urllib2.urlopen('http://example.com', timeout=0) 设置超时时间为0秒
result = f.read()
print(len(result))
except Exception as e:
print('a', str(e))
使用`requests`库
如果你在使用`requests`库进行网络请求,可以通过设置`timeout`参数来控制请求的超时时间。
```python
import requests
url = 'https://example.com'
timeout = 10 设置超时时间为10秒
try:
response = requests.get(url, timeout=timeout)
print(response.status_code)
except requests.exceptions.Timeout:
print('请求超时')
使用`signal`模块
在Linux系统上,你可以使用`signal`模块来处理超时异常。
```python
import time
import signal
class TimeoutError(Exception):
pass
def time_out(interval, callback):
def decorator(func):
def handler(signum, frame):
raise TimeoutError("run func timeout")
def wrapper(*args, kwargs):
try:
signal.signal(signal.SIGALRM, handler)
signal.alarm(interval) 设置闹钟在interval秒后发送SIGALRM信号
result = func(*args, kwargs)
signal.alarm(0) 取消闹钟
return result
except TimeoutError as e:
print(e)
raise
return wrapper
return decorator
@time_out(6) 设置超时时间为6秒
def justtest():
time.sleep(5)
return 5
try:
aaa = justtest()
print(aaa)
except TimeoutError:
print('超时异常')
使用第三方库
例如`func_timeout`库,它允许你为函数设置一个超时时间,并在超时发生时捕获异常。
```python
import time
from func_timeout import func_set_timeout
@func_set_timeout(5) 设置超时时间为5秒
def time_sleep():
time.sleep(10)
try:
time_sleep()
except func_timeout.exceptions.FunctionTimedOut:
print('函数运行超时')
选择合适的方法取决于你的具体需求和环境。