Python任意进程共享内存

Python任意进程共享内存

以下实验与操作在Linux系统有效,windows不清楚。

当进程1创建了一个共享内存对象:

from multiprocessing import shared_memory
shm = shared_memory.SharedMemory(name="abc",create=True, size=10)
...

会在/dev/shm下创建一个共享内存文件:

# ls /dev/shm|grep abc
abc

/dev/shm是OS级别的共享内存机制,因此该共享内存是可以跨任何进程和跨语言的。

创建进程2连接到这块共享内存中:

from multiprocessing import shared_memory
shm = shared_memory.SharedMemory(name="abc",create=False)
...

进程2就可以使用这块共享内存了。

此时会遇到一个问题:即使进程2没有调用unlink方法,但退出时resource_tracker还是会将共享内存释放掉,同时报一个警告,导致进程1和其他进程用不了这块共享内存了

resource_tracker.py:216: UserWarning: resource_tracker: There appear to be 1 leaked shared_memory objects to clean up at shutdown warnings.warn('resource_tracker: There appear to be %d ')

此时查看共享内存,发现已经被删除了:

# ls /dev/shm|grep abc

解决办法:将这块共享内存从resource_tracker中取消注册,进程2退出之后就不会释放掉进程1创建的共享内存了

from multiprocessing import shared_memory, resource_tracker
shm = shared_memory.SharedMemory(name="abc",create=False)
resource_tracker.unregister("abc", 'shared_memory')
...

尽量保证多进程中至少有一个进程不做这个操作,不然会有内存泄漏的风险

参考:

Python中可以使用multiprocessing模块中的Value和Array来实现共享内存。 Value是一个可以被多个进程访问的共享变量,它可以是任意Python对象。你可以通过Value来创建一个共享的整型变量、浮点型变量等。 以下是一个使用Value的示例代码: ```python from multiprocessing import Process, Value def increase_counter(counter): counter.value += 1 if __name__ == '__main__': counter = Value('i', 0) # 创建一个整型共享变量,初始值为0 processes = [] for _ in range(5): p = Process(target=increase_counter, args=(counter,)) p.start() processes.append(p) for p in processes: p.join() print(counter.value) # 输出共享变量的值 ``` 在上述示例中,我们创建了一个共享的整型变量counter,初始值为0。然后,我们创建了5个进程,每个进程都会调用increase_counter函数来增加counter的值。最后,我们输出了counter的最终值。 除了Value,还可以使用Array来创建共享的数组。例如,可以使用'm'表示共享内存的数据类型为字符型、'i'表示整型、'f'表示浮点型等。 以下是一个使用Array的示例代码: ```python from multiprocessing import Process, Array def square_numbers(numbers): for i in range(len(numbers)): numbers[i] = numbers[i] ** 2 if __name__ == '__main__': numbers = Array('i', [1, 2, 3, 4, 5]) # 创建一个整型数组 p = Process(target=square_numbers, args=(numbers,)) p.start() p.join() print(numbers[:]) # 输出共享数组的值 ``` 在上述示例中,我们创建了一个整型数组numbers,初始值为[1, 2, 3, 4, 5]。然后,我们创建了一个进程,该进程会调用square_numbers函数来计算数组中每个元素的平方。最后,我们输出了numbers数组的值。 使用共享内存时需要注意数据的同步问题,可以使用锁来实现对共享数据的互斥访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫空-NS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值