线程 - Python如何实现让一个函数超时退出?
阿神
阿神 2017-04-18 09:15:49
0
3
464

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

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

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

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

阿神
阿神

闭关修行中......

membalas semua(3)
大家讲道理

Adakah anda maksudkan bahawa fungsi tersebut telah melakukan tugas pengkomputeran intensif CPU? Anda boleh membahagikan tugasan itu dan selepas melaksanakan tugasan kecil, semak sama ada ia tamat, dan kembali jika ia tamat, jika tidak, teruskan.

Suplemen:
Jom buat ini

# 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()



Keluaran saya di sini ialah:

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

Saya tidak tahu sama ada senario yang anda hadapi adalah seperti ini. Masalah khusus perlu dianalisis secara terperinci.

Peter_Zhu

modul isyarat:

Rujukan http://blog.sina.com.cn/s/blo...

刘奇

Pertama-tama lihat tempat menyekat yang mungkin dalam fungsi Jika ada tamat masa, tambahkan tamat masa.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan