[英]Python multiprocessing and tkinter - how to connect this process (GUI and spawned process)?
[英]How to configure sentry to send exception from process spawned by python multiprocessing pools?
我有一个由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传递给每个进程,但是到目前为止,我正在尝试避免这种情况。 另外,由于此脚本是由celery worker执行的,因此我已经为celery配置了pool.map()
以及任何异常,直到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()
正如PoloSoares 所说 ,您应该更改传输方式,而不要增加任何睡眠延迟。 raven lib 6.10.0版本的有效解决方案示例:
import multiprocessing
from billiard import Pool
from raven import Client
from raven.transport.http import HTTPTransport
SENTRY_CLIENT = Client("dsn", transport=HTTPTransport)
def process_data(data):
try:
s = data / 0
except ZeroDivisionError:
print("Sentry must report this.")
SENTRY_CLIENT.captureException()
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.