V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yzc27
V2EX  ›  问与答

Python 函数执行超时的问题

  •  
  •   yzc27 · 2019-10-18 11:11:43 +08:00 · 1807 次点击
    这是一个创建于 1870 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求教各位大神,有个函数要执行正则提取,但这个函数有可能在某些情况会执行时间过长(可能是正则问题,但太复杂,无法改),这时我想有个 timeout 让它抛出错误不再执行。

    在网上找了很久都是针对 Unix 用 import signal,而func-timeout包似乎不起作用,求教有没有 windows 平台下方便的解决方案?

    第 1 条附言  ·  2019-10-18 13:37:38 +08:00
    10 条回复    2019-10-18 12:46:12 +08:00
    ysc3839
        1
    ysc3839  
       2019-10-18 11:17:16 +08:00 via Android
    多线程,超时了强行停止?
    yzc27
        2
    yzc27  
    OP
       2019-10-18 11:19:16 +08:00
    @ysc3839 #1 涉及到线程的话,似乎会复杂多了
    sujin190
        3
    sujin190  
       2019-10-18 11:31:21 +08:00
    既然函数已经繁忙于某重 cpu 事情无法返回处理其他事情,他又怎么能知道自己有没有超时呢?这本来就是互斥的,不用多线程强行 kill 没有其他方案了吧
    ipwx
        4
    ipwx  
       2019-10-18 11:43:08 +08:00 via Android
    多线程也不管用吧,确定能 break 只能多进程
    ipwx
        5
    ipwx  
       2019-10-18 11:44:10 +08:00 via Android
    这不是 python 的问题,所有语言都这样。能优雅地 break,必须函数内部有暂停(比如 sleep(0))。否则你只能靠 kill -9
    RHxW
        6
    RHxW  
       2019-10-18 11:53:39 +08:00
    用 func_timeout 写个装饰器,我试了一下可以啊
    yzc27
        7
    yzc27  
    OP
       2019-10-18 11:55:03 +08:00 via iPhone
    @RHxW 难道我用的姿势不对?求范例!
    RHxW
        8
    RHxW  
       2019-10-18 11:56:15 +08:00   ❤️ 1
    ClericPy
        9
    ClericPy  
       2019-10-18 12:08:33 +08:00
    多年前就有的结论(stackoverflow): 无法优雅地停止一个正在执行的线程

    所以, 如果是要匹配很久, 看看是不是已经非常 CPU 密集型了, 开个进程吧, 杀起来手熟

    目前就我所知没有个 async re 这类东西, 不然如果是协程, cancel 起来方便多了, 要不... 你把几百个正则拆成协程试试? 也就随时可以结束了
    malusama
        10
    malusama  
       2019-10-18 12:46:12 +08:00
    用 celery 设置超时时间?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2606 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:16 · PVG 19:16 · LAX 03:16 · JFK 06:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.