Como um programa em Python paralelizado se parece com o comando top?

3

Eu trabalho em um cluster compartilhado. Eu vi pessoas executarem um código paralelizado neste cluster que, quando eu uso top para ver quais processos estão sendo executados, são mostrados usando (por exemplo) 400% da CPU, já que eles estão usando quatro processadores para um instância única do código deles.

Agora alguém está executando (o que eu ouço ser) um código em Python paralelo. No entanto, em vez de top mostrar que o código Python está usando 400% da CPU, ele está sendo mostrado como quatro processos diferentes, cada um usando seu próprio processador (em 100%).

Eu estou querendo saber, o Python (quando paralelizado) mostra com top como executando muitos processos diferentes (em oposição a C) ou este código Python não está sendo executado em paralelo?

Não sei se o Stack Exchange seria um lugar melhor para essa pergunta. Desde que eu estou usando top eu percebi que este lugar seria melhor. Deixe-me saber se devo movê-lo.

    
por Joshua 14.06.2014 / 01:58

2 respostas

5

O que você vê em C está usando threads, então o uso do processo é o total de todos os seus threads. Se houver 4 threads com 100% de uso da CPU cada, o processo será exibido como 400%

O que você vê em python é quase certamente o paralelismo via modelo multiprocessado. Esse é um modelo destinado a superar as limitações de threads do Python. Python só pode executar um thread de cada vez (veja o Global Interpreter Lock - GIL). Para fazer melhor do que isso, pode-se usar o módulo multiprocesso que acaba criando processos ao invés de threads, que por sua vez mostram em ps como múltiplos processos, que podem usar até 100% de CPU cada vez que são (cada) single-single. encadeado.

Aposto que se você executar ps -afeT , verá os encadeamentos do programa C, mas nenhum encadeamento adicional para o programa python.

    
por 14.06.2014 / 02:24
3

A implementação de referência do Python, CPython, possui o Global Interpreter Lock (GIL), que impede que ele execute códigos em paralelo , somente simultaneamente . Threading é útil apenas para E / S. Você precisa de vários processos para poder executar em paralelo. O código C que você está vendo provavelmente está usando threading para paralelismo.

    
por 14.06.2014 / 02:13