我有一个调用函数的循环,该函数有时会挂起(如下例所示).我找到了一个关于如何限制函数调用的执行时间的coupleexamples.然而,它们在循环情况下失败,因为当中断信号发生时,我们可能正在进行下一个循环.有没有办法限制下面代码的执行时间?

def perhaps_long_exec():
  if random.random() < 0.5:
    while True:
      pass

for i in range(100)
  # limit execution time of below function call
  perhaps_long_exec()

我们假设perhaps_long_exec()是一个不能修改的外部函数.我刚才给出了一个示例函数,说明该函数内部可能包含什么内容,但该函数本身是一个黑盒.

推荐答案

使用多处理似乎是一个不错的解决方案. for each 循环创建一个新的进程,如果它被卡住了,就终止它.

import random
import time
from multiprocessing import Process


def perhaps_long_exec():
    x = random.random()
    print(x)
    if x < 0.5:
        print('Stuck!')
        while True:
            pass
    else:
        print('Fine')


if __name__ == '__main__':
    for i in range(100):
        p = Process(target=perhaps_long_exec)  # make process
        p.start()  # start function
        time.sleep(3)  # wait 3 secs
        if p.is_alive(): # check if process is still going
            p.terminate()  # kill it
            print('Killed')

输出:

> 0.26936380878403265
> Stuck!
> Killed
> 0.5185183414607246
> Fine
> 0.4361287927947891
> Stuck!
> Killed

Python相关问答推荐

是否有使用纯霍夫曼编码的现代图像格式?

Python-Polars:如何用两个值的平均值填充NA?

使用pandas MultiIndex进行不连续 Select

从多行文本中提取事件对

Tkinter滑动条标签.我不确定如何删除滑动块标签或更改其文本

pyautogui.locateOnScreen在Linux上的工作方式有所不同

有什么方法可以避免使用许多if陈述

如何在Deliveryter笔记本中从同步上下文正确地安排和等待Delivercio代码中的结果?

Pandas 填充条件是另一列

提取两行之间的标题的常规表达

Odoo 14 hr. emergency.public内的二进制字段

使用miniconda创建环境的问题

无法通过python-jira访问jira工作日志(log)中的 comments

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

我如何使法国在 map 中完全透明的代码?

Stacked bar chart from billrame

在vscode上使用Python虚拟环境时((env))

Pandas—在数据透视表中占总数的百分比

Python—转换日期:价目表到新行

搜索按钮不工作,Python tkinter