python 多进程共享内存样例

最近在搞python多进程共享内存,写个样例大家分享一下,主进程创建了3种多进程共享的内存的机制,分别是单值,数组,字符串。并且通过初始化函数将可共享的参数传递给A,B两个类。A类负责读取共享内容,B类负责修改共享内容。使用的是线程不安全的rawxxx型变量,具体需要参考使用场景,可以进行一定的更改。

Python V3.11 OS:Centos 8

主进程如下所示:

import ctypes
import multiprocessing
from multiprocessing import shared_memory

import classA
import classB

if __name__ == "__main__":
    m_data_arr = multiprocessing.RawArray('f', 4000)
    dc_status = multiprocessing.RawValue('i', 0)
    e_data_arr = multiprocessing.RawArray('f', 4000)
    str_data=multiprocessing.Manager().Value(ctypes.c_wchar_p, b"TestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTest")

    char_data_arr = shared_memory.ShareableList(range(4000))

    ca = classA.classA(str_data,dc_status, m_data_arr, e_data_arr, char_data_arr)
    cb = classB.classB(str_data,dc_status, m_data_arr, e_data_arr, char_data_arr)

    p1 = multiprocessing.Process(target=cb.numberchange)
    p2 = multiprocessing.Process(target=ca.numberread)

    p1.start()
    p2.start()

    p1.join()
    p2.join()
    print("main end")

B类:

import random
import string
from concurrent.futures import ThreadPoolExecutor


class classB(object):
    def __init__(self,str_data, dc_status, m_data_arr, e_data_arr, char_data_arr):
        self.dc_satatus = dc_status
        self.str_data=str_data
        self.m_data_arr = m_data_arr
        self.e_data_arr = e_data_arr
        self.char_data_arr = char_data_arr

    
    def str_generator(self, size=6, chars=string.ascii_uppercase + string.digits):
        return ''.join(random.choice(chars) for _ in range(size))

    def calculate(self, i,str, st, arr1, arr2, arr3):
        str.value=self.str_generator(40).encode("utf-8")
        for a in range(i * 10, i * 10 + 10):
            try:
                st.value = a
                arr1[a] = random.random()
                arr2[a] = random.random()
                arr3[a] = self.str_generator(4)
            except Exception as e:
                print(a, e)

    def numberchange(self):
        expool = ThreadPoolExecutor(max_workers=50)
        while True:
            for t in range(400):
                # 10 elements per thread
                # print(self.str_data[0])
                expool.submit(self.calculate(t, self.str_data,self.dc_satatus, self.m_data_arr, self.e_data_arr, self.char_data_arr))

A类

import time

class classA(object):
    def __init__(self, str_data,dc_status, m_data_arr, e_data_arr, char_data_arr):
        self.dc_satatus = dc_status
        self.str_data=str_data
        self.m_data_arr = m_data_arr
        self.e_data_arr = e_data_arr
        self.char_data_arr = char_data_arr

    def numberread(self):
        while True:
            time.sleep(5)
            for a in range(4000):

                print(self.dc_satatus.value, end=" ")
                print(self.char_data_arr[a], end=" ")
                print(self.e_data_arr[a], end=" ")
                print(self.m_data_arr[a], end=" ")
                print(self.str_data.value.decode('utf-8'))

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值