python - 无法使用 python eventlet 库超时(eventlet.timeout.Timeout)

标签 python python-3.x timeout try-catch eventlet

我正在循环一个列表并对列表中的每个成员执行一些操作。 如果某个成员花费了太多时间(在本例中为 1 秒),我打算跳过它。但是,try 语句内的 block 始终处于处理状态,并且永远不会超时。我不明白为什么。

    from eventlet import *        

    for rule in data:

        #Timeout block
        t=Timeout(1)
        try:
            f = expr2bdd(expr(rule))
            solutions = satisfy_all(f, count=True)
            each_rule["solution"]=solutions
        except:
            pass
        finally:
            t.cancel()

最佳答案

Eventlet is a concurrent networking library...

尚不清楚 expr2bddsatisfy_all 函数的作用,但很可能它们只进行一些 CPU 计算,而不进行磁盘/网络 IO。在这种情况下,Eventlet 没有机会运行并引发超时异常。

如果您可以控制 expr2bddsatisfy_all 函数并且存在任何类型的循环,请将 eventlet.sleep(0) 放置在每个函数处迭代。这是 Eventlet 惯用语,意思是“将控制权交给其他协程”,这就是超时将被触发的地方。

如果您无法控制上述函数,第二个最佳选择是在可以强制终止的单独进程中运行它们。在 POSIX 兼容操作系统(例如 Linux、*BSD、OSX)上,您可以使用 os.fork 在单独的进程中运行一段代码。为了获得最大的可移植性,请使用 subprocess.Popen([sys.executable,...])multiprocessing.Process。后者提供了更高级别的 API,主要围绕更容易的数据交换(序列化),但以性能开销为代价,这在您的情况下可能可以忽略不计。无论如何,基本模式是这样的:(在线程或 eventlet 协程中,您启动第二个进程,然后对其进行 .communicate()/join() 。使用 eventlet.TimeoutThread.join() 带有超时。如果超时,请使用 p.terminate()p.kill()停止当前计算。

关于python - 无法使用 python eventlet 库超时(eventlet.timeout.Timeout),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30165465/

相关文章:

python - 预期类型 'str' ,Tuple[str] 在 python3.8 中返回

http - 如果请求在 http.Server 中超时,为什么在 Firefox 中会无限期地重复?

java - Hadoop 总是以 java.util.concurrent.TimeoutException 结束

python - 为 Pyramid Web 应用程序编写文档测试,该应用程序取决于 ini 文件中的设置

python - 加速 Python 中图像距离变换的计算

Python 模拟、django 和请求

python - 使用 psycopg2 和 python 3.4 将数据从 csv 插入到 postgres 表

Python 错误 : The view form. formapp.views.contact 未返回 HttpResponse 对象。解决

python - float() 对象 ID 创建顺序

node.js - 处理从 nodejs 与 mongo db 的连接丢失