/ / As variáveis ​​globais estáticas no CPython são inseguras? - c ++, multiprocessamento, cpython

As variáveis ​​globais estáticas no CPython não são seguras? - c ++, multiprocessamento, cpython

Em um arquivo de origem C ++ que estou envolvendo em uma função python, alguém incluiu o seguinte:

namespace some_namespace
{
static double some_double;
}

float function_that_uses_some_double(float input) {
// implementation
return result;
}

O global estático some_double só é usado dentro da função, então se euEnrole isso em uma função CPython e chamá-lo no código single-threaded, a variável só será usada por uma função por vez. É feio, mas não tem problema. Minha pergunta é o que acontece se eu usar:

  1. a threading módulo ou
  2. a multiprocessing módulo.

Quando tenho vários processos e / ou threads usando este módulo, eles interferem uns com os outros?

Respostas:

1 para resposta № 1

Se você usar o módulo de segmentação, todas as funções simplesmente compartilharão essa variável global. Threads em python são alternados entre limites de bytecode, portanto, o bloqueio não é um problema.

Se você usa o módulo de multiprocessamento, as coisas sãodiferente e depende um pouco do seu uso de multiprocessamento. O Python inicia com um único processo, portanto, há apenas uma cópia da variável global. O valor dessa variável quando você começar a usar o multiprocessamento (ou seja, forjar novos processos python a partir do processo principal) será copiado nos subprocessos (tarefas), mas esses processos terão sua própria cópia da variável global.

Se você ficar complicado e configurar um segmento de memória compartilhada (mmap com MAP_SHARED) e a variável for um ponteiro, o local apontado será compartilhado e você precisará usar o bloqueio.


0 para resposta № 2

Se você estiver indo para alterar some_double (que eu suponho que você é porque não é uma variável const), então você terá que fazer algum tipo de bloqueio (por exemplo, mutex) se você usar vários segmentos.