• 在使用 爬虫 的相关技术中,有很多方法都具有 timeout 参数,也可以利用多进程实现timeout 函数,思路如下:
    • 将运行函数放到子进程中运行,在主进程中等待子进程执行join([timeout]),然后判断子进程的状态 is_alive(),如果为真,说明子进程还在运行,已经超过我们的限制时间,则打断子进程,并在主进程中抛出异常。

    • 实现如下:

      这里在函数 run_limit()中包含一个辅助函数,我们也可以将辅助函数作为一个参数,可以实现对所有函数转成timeout 函数

    1. from multiprocessing import Process
    2. import time
    3. def run_limit(timeout=5):
    4. def fun():
    5. i = 0
    6. while True:
    7. time.sleep(1)
    8. i += 1
    9. print(i)
    10. p = Process(target=fun, )
    11. p.start()
    12. p.join(timeout=timeout)
    13. if p.is_alive():
    14. p.terminate()
    15. raise TimeoutError(f'运行超时{timeout}!')
    16. if __name__ == '__main__':
    17. run_limit()
    • 注意,这里每执行该函数都会启动一个子进程,较普通函数有较大的消耗