- 在使用 爬虫 的相关技术中,有很多方法都具有 timeout 参数,也可以利用多进程实现timeout 函数,思路如下:
将运行函数放到子进程中运行,在主进程中等待子进程执行join([timeout]),然后判断子进程的状态 is_alive(),如果为真,说明子进程还在运行,已经超过我们的限制时间,则打断子进程,并在主进程中抛出异常。
实现如下:
这里在函数 run_limit()中包含一个辅助函数,我们也可以将辅助函数作为一个参数,可以实现对所有函数转成timeout 函数
from multiprocessing import Process
import time
def run_limit(timeout=5):
def fun():
i = 0
while True:
time.sleep(1)
i += 1
print(i)
p = Process(target=fun, )
p.start()
p.join(timeout=timeout)
if p.is_alive():
p.terminate()
raise TimeoutError(f'运行超时{timeout}!')
if __name__ == '__main__':
run_limit()
- 注意,这里每执行该函数都会启动一个子进程,较普通函数有较大的消耗