python-3.x - 多处理中的 Google Stackdriver 不起作用
问题描述
我使用 Flask 构建了一个 API 端点,其中数据是从其他 API 收集和组合的。为了有效地做到这一点,我使用多进程。为了保持控制,我想使用 Google Stackdriver 记录所有步骤。
出于某种原因,在我的多进程环境中使用 Google Stackdriver 时,我不断收到错误消息。我在 MWE 中收到的错误和后来的警告如下:
Pickling client objects is explicitly not supported.
Clients have non-trivial state that is local and unpickleable.
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Users\...\Anaconda3\lib\multiprocessing\spawn.py", line 105, in spawn_main
exitcode = _main(fd)
File "C:\Users\...\Anaconda3\lib\multiprocessing\spawn.py", line 115, in _main
self = reduction.pickle.load(from_parent)
EOFError: Ran out of input
最小的工作示例(为简单起见,不包括 Flask/API):
project_name = project_name = 'budget_service'
message = 'This is a test'
labels = {
'deployment': 'develop',
'severity': 'info'
}
# Import libs
from google.cloud import logging
import multiprocessing as mp
# Initialize logging
logging_client = logging.Client()
logger = logging_client.logger(project_name)
# Function to write log
def writeLog(logger):
logger.log_text(
text = message,
labels = labels
)
print('logger succeeded')
def testFunction():
print('test')
# Run without mp
writeLog(logger)
# Run with mp
print(__name__)
if __name__ == '__main__':
try:
print('mp started')
# Initialize
manager = mp.Manager()
return_dict = manager.dict()
jobs = []
# Set up workers
worker_log1 = mp.Process(name='testFunction', target=testFunction, args=[])
worker_log2 = mp.Process(name='writeLog', target=writeLog, args=[logger])
# Store in jobs
jobs.append(worker_log1)
jobs.append(worker_log2)
# Start workers
worker_log1.start()
worker_log2.start()
for job in jobs:
job.join()
print('mp succeeded')
except Exception as err:
print(err)
为什么不能将多处理与 Google Stackdriver 结合起来?我应该调整什么(我对什么理解不好)才能完成这项工作?
解决方案
截至今天(04.2019),stackdriver 日志仍然不支持多处理。解决方案是:
- 确保您的进程以
spawn
模式而不是fork
(*nix 上的默认值)启动,这会阻止共享任何内容 - 通过在每个进程中单独配置它们来避免显式共享日志记录对象
对于谷歌库,使用fork
多处理通常是一个坏主意,stackdriver 并不是唯一引起问题的。
推荐阅读
- asp.net - 读取 web.config 时出现 IIS 错误 500.19 错误
- python - 为什么我估计的负对数似然损失对于所有输入图像都是恒定的
- ruby-on-rails - 如何在没有 N+1 的自引用表中找到记录的每个升序
- git - git push dry run 和 git pull 有效,但不是 git push
- node.js - 是否可以使用 SAML2 在 ReactJs 应用程序中实现 SSO?如果可能怎么办?
- angular - 角度检查项目是否在带有 Rxjs 运算符的 Observable 数组中
- angular - Angular unit test error ( finalSprintsList.map is not a function ) with jasmine karma
- wso2 - 使用 WSO2 APIM 3.0 配置 WSO2 APIM 分析时出现问题
- ios - 我正在快速处理收藏夹,在 favorite_btn 单击我想将按钮的图像从星形更改为 star.fill
- c# - WPF 与 ElementName 绑定不会更新值