Массив структур в Python - PullRequest
0 голосов
/ 04 мая 2018

Я не могу использовать многопроцессорность, мне нужна общая память между совершенно отдельными процессами python в Windows, использующими python 3. Я выяснил, как это сделать с помощью mmap, и это прекрасно работает ... когда я использую простые примитивные типы. Однако мне нужно передать более сложную информацию. Я нашел ctypes.Structure, и, похоже, это именно то, что мне нужно.

Я хочу создать массив ctypes.Structure и обновить отдельный элемент в этом массиве, записать его обратно в память, а также прочитать отдельный элемент.

import ctypes
import mmap


class Person(ctypes.Structure):
    _fields_ = [
        ('name', ctypes.c_wchar * 10),
        ('age', ctypes.c_int)
    ]

if __name__ == '__main__':
    num_people = 5

    person = Person()

    people = Person * num_people
    mm_file = mmap.mmap(-1, ctypes.sizeof(people), access=mmap.ACCESS_WRITE,     tagname="shmem")

1 Ответ

0 голосов
/ 04 мая 2018

Ваш people еще не массив, это все еще класс. Чтобы получить ваш массив, вам нужно инициализировать класс с помощью from_buffer(), как вы делали это раньше с c_int:

PeopleArray = Person * num_people
mm_file = mmap.mmap(-1, ctypes.sizeof(PeopleArray), ...)
people = PeopleArray.from_buffer(mm_file)

people[0].name = 'foo'
people[0].age = 27
people[1].name = 'bar'
people[1].age = 42
...
...