Python如何实现让一个函数超时退出?

发布于 2022-09-03 08:53:40 字数 523 浏览 24 评论 0

需求: 多个子线程同时调用a函数处理数据,如何实现让a函数超时之后return或者raise?

1 signal不能在子线程中使用,pass
2 把函数扔到进程里,开销太大,pass
3 把函数扔到单独线程里,改编进程类另其可接受终止信号,再开另外一个线程做监控,不易实现,且个人认为杀掉进程对系统资源的风险很大.

有没有什么好的解决方案,或者已有类库里面的timeout参数都是如何实现的呢?gevent有没有什么好的线程终止方案?

参考:
http://stackoverflow.com/ques...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

原野 2022-09-10 08:53:40

你的意思是函数一直在做cpu密集型的计算任务吗?可以把任务分割,执行完一个小任务后检查是否超时,超时return,否则继续。

补充:
这样吧

# coding=utf-8
import datetime
import time


def run(n):
    s = 0
    for i in range(0, n):
        for j in range(0, n):
            s += 1
    return s


def run_within_time(n, time_in_millisecond):
    s = 0

    start_time = long(time.time() * 1000)
    for i in range(0, n):
        for j in range(0, n):
            s += 1
        elapsed = long(time.time() * 1000) - start_time
        # 做完一部分任务后,判断是否超时
        if elapsed >= time_in_millisecond:
            s = -1
            break
    return s


num = 10000
print long(time.time() * 1000)
print datetime.datetime.now()
print run(num)
print 'run :'
print datetime.datetime.now()
print run_within_time(num, 200)
print 'run_within_time:'
print datetime.datetime.now()



我这边的输出是:

2016-07-28 22:25:33.271503
100000000
run :
2016-07-28 22:25:37.473611
-1
run_within_time:
2016-07-28 22:25:37.673276

不知道你面对的场景是不是这样,具体问题还要具体分析。

忱杏 2022-09-10 08:53:40

先看看函数里有哪些可能阻塞的地方,有timeout的话加timeout.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文