我有一个由celery worker运行的脚本,该脚本使用台球库中的Pool,并且产生了多个进程。我试图在这些过程中使用哨兵,以便可以捕获任何未处理/未处理的异常。下面写的是我的示例代码:

from configurations import SENTRY_CLIENT


def process_data(data):
try:
    s = data/0
except ZeroDivisionError:
    print "Sentry must report this."
    SENTRY_CLIENT.captureException()

import multiprocessing
from billiard import Pool
POOL_SIZE=multiprocessing.cpu_count()
pool = Pool(POOL_SIZE)
data=[0, 1, 2, 3, 4, 5]
pool.map(process_data, data)
pool.close()
pool.terminate()


SENTRY_CLIENT在配置文件中定义,该文件定义为:
configuration.py

from raven import Client
SENTRY_CLIENT = Client("dsn")


我正在尝试的一种方法是将SENTRY_CLIENT传递给每个进程,但是到目前为止,我正在尝试避免这种情况。
另外,由于此脚本是由芹菜工作者执行的,因此我已将哨兵配置为芹菜,并且在pool.map()被哨兵很好地捕获之前可以配置任何例外。

另外,我尝试打印SENTRY_CLIENT.__dict__,并且得到了具有正确值的有效项目。
我的问题是,为什么SENTRY_CLIENT不会将异常发送到哨点仪表板。可能是我在配置中缺少某些内容。

最佳答案

我终于通过一些阅读获得了解决方案。
Sentry在基于异步事件的模型上工作,并且在触发哨兵后立即杀死进程将无法确保服务器达到异常。因此,在发生任何异常的情况下终止进程之前,我们需要添加一个10s的延迟,以确保哨兵能够正常工作。

def process_data(data):
    from configurations import SENTRY_CLIENT
    try:
       s = data/0
    except ZeroDivisionError:
       print "Sentry must report this."
       import time
       SENTRY_CLIENT.captureException()
       time.sleep(10)

import multiprocessing
from billiard import Pool
POOL_SIZE=multiprocessing.cpu_count()
pool = Pool(POOL_SIZE)
data=[0, 1, 2, 3, 4, 5]
pool.map(process_data, data)
pool.close()
pool.terminate()

关于python - 如何配置哨兵从python多处理池产生的进程发送异常?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44173252/

10-09 02:47