最近在搞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'))