0

我有一系列执行任务的芹菜工人,使用 REDIS 存储;特别是我有三类工人,它们分别执行三类任务。属于这些类别中的每一个的任务都需要访问 mongo DB。出于效率的原因,我想使用单个连接到数据库以供所有工作人员使用。到目前为止,我已经尝试通过以下方式将连接作为参数传递给“send_task”:

myclient = MongoClient('localhost:27017')
celeryWorker.send_task('tasks.beampolyline', myclient)

但很明显,它返回对象不是 JSON 可序列化的错误;两者都试图在所有工作人员之间共享 myclient 对象,但结果不佳。任何想法 ?我觉得我非常接近解决方案,但我被困在我试图使用的两种方法上。

4

2 回答 2

0

一种解决方案是定义模块级连接。假设worker.py作为您的工作模块:

from mongodb import MongoClient

shared_connection = MongoClient()

@app.task(...)
def task(self, a, b):
    ...  # use shared_connection inside task
    return 

在此解决方案中,此工作线程/进程之间共享连接。

于 2021-07-18T14:56:26.603 回答
0

你不能做类似的事情吗?:

import pymongo
from pymongo import MongoClient
from flask import *

client = pymongo.MongoClient("yourcredentials")
db = client['ALLWORKER']
worker_1 = db['worker1']
worker_2 = db['worker_2']
于 2021-07-18T15:56:10.480 回答