Python 通过多处理管理器共享自定义类对象

Python 通过多处理管理器共享自定义类对象,python,python-3.x,multiprocessing,python-multiprocessing,multiprocessing-manager,Python,Python 3.x,Multiprocessing,Python Multiprocessing,Multiprocessing Manager,我正在从事一个项目,在这个项目中,我有非常特殊的日志类型,为了使这些日志正常工作,我创建了一个类,它基本上维护一个字典,记录执行的每个步骤的时间和采取的行动。它后来用于多种分析目的。稍后,我从这个字典创建了一个JSON文件,并将其上传到s3 bucket 当我只有一个主要流程时,一切都很顺利。但是为了提高效率,我为一个特定的任务加入了多处理。我正在生成4个进程,它们调用相同的函数,我希望维护日志的类的对象由所有这些进程共享 我已经讨论了其他的问题,但似乎没有一个有效。如果你认为这有更好的答案,请

我正在从事一个项目,在这个项目中,我有非常特殊的日志类型,为了使这些日志正常工作,我创建了一个类,它基本上维护一个字典,记录执行的每个步骤的时间和采取的行动。它后来用于多种分析目的。稍后,我从这个字典创建了一个JSON文件,并将其上传到s3 bucket

当我只有一个主要流程时,一切都很顺利。但是为了提高效率,我为一个特定的任务加入了多处理。我正在生成4个进程,它们调用相同的函数,我希望维护日志的类的对象由所有这些进程共享

我已经讨论了其他的问题,但似乎没有一个有效。如果你认为这有更好的答案,请指导我,我可能会跳过它

class JsonLogs:
    def __init__(self, date, site_name, user_uuid, is_login=False, request_data=None):
        self.date = date
        self.attribute = value
        if is_login:
            ...
        else:
            ...


    def add_a_logs(self, process, message):
        self.log_dict['key']['some_key'].append(
            {
             'start_time': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f'),
             'start_message': message,
             'end_message': None,
             'end_time': None,
             'duration': None

            }
        )

    def update_a_logs(self, process=None, message=None, response_data=None):
        log_obj = next((log for log in self.log_dict["key"]['some_key'] if log['process'] == process),
                       None)

        if response_data:
            self.log_dict['key']['some_key'] = response_data

        if log_obj:
            log_obj['end_time'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
            log_obj['end_message'] = message
            td = datetime.datetime.now() - datetime.datetime.strptime(log_obj['start_time'], '%Y-%m-%d %H:%M:%S.%f')

            log_obj['duration'] = "{}".format(td.seconds)

    .....
    .....
还有其他类似的方法,然后这个字典被转换成JSON并上传到s3 bucket中。这与python日志模块无关,因为我有一个非常具体的需求

我需要这个类的对象被我正在创建的4个进程共享

编辑

为了让别人更容易理解,我真正想要实现的目标可以通过下面给出的两个例子来理解

单一流程:这是可行的

from multiprocessing import Process


class A:
    def __init__(self, a):
        self.a = a

def a():
    x = A(10)
    b(x)
    print(x.a)

def b(y):
    y.a = 20

a()
产出:20

多重处理:我正在努力实现的目标

from multiprocessing import Process


class A:
    def __init__(self, a):
        self.a = a


def a():
    x = A(10)
    p1 = Process(target=b, args=(x,))
    p2 = Process(target=b, args=(x,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    # b(x)
    print(x.a)

def b(y):
    y.a = 20


a()
电流输出:10

我需要的是:20


您需要使用共享内存在进程之间共享对象,因为每个进程都有自己的内存空间。您可以使用共享对象。但最好避免共享复杂的对象,正如

或者,您可以使用对象。以下是一个玩具示例:

import datetime
from multiprocessing import Process, Queue

def worker(q):
    for _ in range(5):
        q.put(
        {
            'start_time': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f'),
            'start_message': 'message'
        })
    q.put(None) # End of the queue

def a():
    q = Queue()
    p1 = Process(target=worker, args=(q,))
    p2 = Process(target=worker, args=(q,))
    p1.start()
    p2.start()

    worker_end = 0
    while True:
        i = q.get()
        if i is None:
            worker_end += 1
        else:
            print(i)

        if worker_end == 2:
            break

    p1.join()
    p2.join()

a()

您需要使用共享内存在进程之间共享对象,因为每个进程都有自己的内存空间。您可以使用共享对象。但最好避免共享复杂的对象,正如

或者,您可以使用对象。以下是一个玩具示例:

import datetime
from multiprocessing import Process, Queue

def worker(q):
    for _ in range(5):
        q.put(
        {
            'start_time': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f'),
            'start_message': 'message'
        })
    q.put(None) # End of the queue

def a():
    q = Queue()
    p1 = Process(target=worker, args=(q,))
    p2 = Process(target=worker, args=(q,))
    p1.start()
    p2.start()

    worker_end = 0
    while True:
        i = q.get()
        if i is None:
            worker_end += 1
        else:
            print(i)

        if worker_end == 2:
            break

    p1.join()
    p2.join()

a()

您没有在此处共享自定义类对象,这是实际需求。我知道我们不应该这样做,但正如我所说的,我有一个非常具体的要求。你没有在这里共享自定义类对象,这是实际的要求。我知道我们不应该这样做,但正如我所说,我有一个非常具体的要求。