【问题标题】:Handling a SIGTERM when blocked in Queue.Queue.get()在 Queue.Queue.get() 中阻塞时处理 SIGTERM
【发布时间】:2023-04-11 10:49:01
【问题描述】:

我有一个程序在读取Queue.Queue 时通常会被阻止。在程序中,我为SIGTERM 定义了一个信号处理程序,但它似乎忽略了它。

对于我没有被队列阻塞的其他程序,此方法有效。

有没有办法捕获 SIGTERM ?我知道添加timeout 可以解决这个问题,但这会增加 CPU 使用率,我负担不起。

【问题讨论】:

    标签: python multithreading queue signals


    【解决方案1】:

    似乎没有办法解决它,只能在无限循环中使用timeout,或者可能使用queue.Queue 的替代实现(我不知道是否有)。你并不孤单。我打了,其他几个人(123)也打了。

    我相信你知道如何实现轮询,但我想我会加入我的解决方案:

    while 1:
        try:
            new_item = my_queue.get(timeout=1.0)
        except queue.Empty:
            pass
        else:
            break
    

    【讨论】:

    • 我正在这样做,但超时=OneYear。但是,该程序时不时地使用 1% 的 CPU,而我有数千个程序在运行。有一天,我随机发现用 python 3 解决了这个问题,但是我必须坚持使用 2.7。
    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2014-07-01
    相关资源
    最近更新 更多