2017-03-13 2 views
0

J'essaie de comprendre le GIL de Python. J'ai récemment eu une mission où je devais comparer les temps d'exécution d'une certaine tâche effectuée en utilisant différents algorithmes de complexité temporelle différente sur plusieurs fichiers d'entrée. J'ai exécuté un script python pour faire de même, mais j'ai utilisé des fenêtres de terminal séparées sur macOS pour exécuter le même script python pour différents fichiers d'entrée. J'ai également couru le tout dans une fenêtre de terminal, l'un après l'autre, pour chaque fichier d'entrée. Le temps CPU pour cela était inférieur pour chaque exécution par rapport à l'approche précédente avec plusieurs fenêtres où chaque programme prenait deux fois plus de temps mais courait tous en même temps. (Note: il y avait 4 fenêtres de terminal dans l'approche précédente et le script python ne faisait qu'exécuter un exécutable a.out compilé avec clang sur macOS et stocké la sortie dans des fichiers différents).GIL affecte-t-il le traitement parallèle d'un script python dans des fenêtres de terminal distinctes?

Quelqu'un peut-il expliquer pourquoi l'exécution en parallèle conduit à un ralentissement de chaque programme? Ont-ils fonctionné sur des cœurs séparés ou est-ce que le GIL a conduit à ce que chaque programme soit plus lent que si je le faisais un à la fois dans une fenêtre de terminal?

+0

Le programme accède-t-il au disque ou à quelque chose d'autre? – Scovetta

+0

Le programme prend une entrée de nombres de stdin et imprime 3 chaînes sur stdout que je redirige vers les fichiers en utilisant le < and > suivi de différents noms de fichiers pour chaque programme. Je ne pense pas qu'ils partagent quelque chose puisque le a.out est juste un programme de tri avec 1 fonction autre que la main. –

Répondre

1

Chaque fenêtre de terminal lancera un nouvel interpréteur python, chacun ayant son propre GIL. La différence est probablement due à la contention de certaines ressources au niveau du système d'exploitation (disques d'E/S, mémoire, cycles de CPU).

+0

Chaque script exécute a.out à l'aide de popen() et redirige la sortie vers un fichier texte différent. Ce n'est donc pas le GIL et je ne vois pas ce qu'ils partagent d'autre. Peut-être que les cycles CPU. –

+0

Si vous avez un cpu multi-core et un disque magnétique, c'est probablement un conflit d'E/S, mais oui, c'est certainement autre chose que le GIL – cco