Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

2.1K
Visualizações
Cómo usar la memoria compartida en python y C/C++

Estoy tratando de modificar un programa de python para poder comunicarme con un programa de C++ usando memoria compartida. La responsabilidad principal del programa python es leer algunos cuadros de video de una cola de entrada ubicada en la memoria compartida, hacer algo en el cuadro de video y volver a escribirlo en la cola de salida en la memoria compartida.

Creo que hay algunas cosas que debo lograr y sería genial si alguien pudiera arrojar algo de luz al respecto:

  1. Memoria compartida: en C/C++, puede usar funciones como shmget y shmat para obtener el puntero a la memoria compartida. ¿Cuál es la forma equivalente de manejar esto en python para que tanto python como el programa C ++ puedan usar la misma pieza de memoria compartida?

  2. Sincronización : debido a que esto implica multiprocesamiento, necesitamos algún tipo de mecanismo de bloqueo para la memoria compartida en los programas C++ y Python. ¿Cómo puedo hacer esto en Python?

¡Muchas gracias!

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Quizás shmget y shmat no sean necesariamente las interfaces más apropiadas para su uso. En un proyecto en el que trabajo, brindamos acceso a un daemon a través de una API de C y Python usando archivos mapeados en memoria, lo que nos brinda una forma muy rápida de acceder a los datos.

El orden de las operaciones es algo así:

  • el cliente hace un door_call() para decirle al daemon que cree una región de memoria compartida
  • el daemon crea de forma segura un archivo temporal
  • el daemon open() s y luego mmap() s ese archivo
  • el daemon devuelve el descriptor de archivo al cliente a través door_return()
  • el cliente mmap() es el descriptor de archivo y asocia variables colocadas consecutivamente en una estructura con ese fd
  • el cliente realiza las operaciones que necesita en esas variables, cuando necesita hacerlo.
  • el demonio lee de la región compartida y realiza sus propias actualizaciones (en nuestro caso, escribe valores de esa región compartida en un archivo de registro).

Nuestros clientes hacen uso de una biblioteca para manejar los primeros 5 pasos anteriores; la biblioteca viene con envoltorios de Python que usan ctypes para exponer exactamente qué funciones y tipos de datos se necesitan.

Para su espacio problemático, si es solo la aplicación python la que escribe en su cola de salida, entonces puede rastrear qué marcos se han procesado solo en la aplicación python. Si sus aplicaciones de python y c ++ están escribiendo en la cola de salida, eso aumenta su nivel de dificultad y quizás refactorizar la arquitectura general de la aplicación sería una buena inversión.

over 4 years ago · Santiago Trujillo Relatório

0

Sorta, un poco de memoria compartida. Así que no es exactamente lo que quería el OP.

Esto funciona usando archivos mapeados en memoria. No reclamo alta velocidad o eficiencia de ninguna manera. Estos son solo para mostrar un ejemplo de su funcionamiento.

 $ python --version Python 3.7.9 $ g++ --version g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

El lado de C++ solo monitorea los valores que necesita. El lado de Python solo proporciona los valores.

Nota: el nombre del archivo "pods.txt" debe ser el mismo en el código C++ y Python.

 #include <sys/mman.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main(void) { // assume file exists int fd = -1; if ((fd = open("pods.txt", O_RDWR, 0)) == -1) { printf("unable to open pods.txt\n"); return 0; } // open the file in shared memory char* shared = (char*) mmap(NULL, 8, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); // periodically read the file contents while (true) { printf("0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n", shared[0], shared[1], shared[2], shared[3], shared[4], shared[5], shared[6], shared[7]); sleep(1); } return 0; }

El lado de pitón:

 import mmap import os import time fname = './pods.txt' if not os.path.isfile(fname): # create initial file with open(fname, "w+b") as fd: fd.write(b'\x01\x00\x00\x00\x00\x00\x00\x00') # at this point, file exists, so memory map it with open(fname, "r+b") as fd: mm = mmap.mmap(fd.fileno(), 8, access=mmap.ACCESS_WRITE, offset=0) # set one of the pods to true (== 0x01) all the rest to false posn = 0 while True: print(f'writing posn:{posn}') # reset to the start of the file mm.seek(0) # write the true/false values, only one is true for count in range(8): curr = b'\x01' if count == posn else b'\x00' mm.write(curr) # admire the view time.sleep(2) # set up for the next position in the next loop posn = (posn + 1) % 8 mm.close() fd.close()

Para ejecutarlo, en la terminal #1:

 a.out # or whatever you called the C++ executable 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00

es decir, debería ver que el 0x01 se mueve un paso cada dos segundos debido a sleep(2) en el código C++.

en la terminal #2:

 python my.py # or whatever you called the python file writing posn:0 writing posn:1 writing posn:2

es decir, debería ver el cambio de posición de 0 a 7 y volver a 0 nuevamente.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda