2009-02-11 7 views
2

Je sais que Python a un global lock et j'ai lu l'explication de Glyph de python multithreading. Mais je veux toujours l'essayer. Ce que j'ai décidé de faire en tant que tâche facile (conceptuellement) était de faire une détection de bord horizontal et vertical sur une image.pratique avec des threads en python

Voici ce qui se passe (pseudo-code):

for pixels in picture: 
    apply sobel operator horizontal 
for pixels in picture: 
    apply sobel operator vertical 

info on sobel operator.

Ces deux boucles peuvent s'exécuter complètement indépendamment l'une de l'autre, et seraient donc les meilleurs candidats pour le multithreading. (exécuter ces deux boucles sur n'importe quelle image significativement grande peut prendre 10+ secondes). Cependant, quand j'ai essayé d'utiliser le module threading en python, cela prend deux fois plus de temps à cause du verrou global. Ma question est de devrais-je abandonner tout espoir de le faire dans deux threads en python et essayer dans une autre langue? Si je peux aller de l'avant, quel (s) module (s) devrais-je utiliser? Si non, dans quelle langue devrais-je expérimenter?

Répondre

7

Python 2.6 inclut désormais le module mulitprocessing (anciennement module processing sur les anciennes versions de Python).

Il a essentiellement la même interface que le module threading, mais lance l'exécution dans des processus distincts plutôt que des threads. Cela permet à Python de tirer parti de plusieurs cœurs/processeurs et de s'adapter aux tâches gourmandes en ressources par rapport à l'approche du module de thread.

3

Si l'opérateur sobel est lié au processeur, vous ne bénéficierez pas de plusieurs threads car python ne tire pas parti de plusieurs cœurs. En théorie, vous pourriez faire tourner plusieurs processus, même si je ne suis pas sûr que ce serait pratique pour travailler sur une seule image.

10 secondes ne semble pas perdre beaucoup de temps. Si le temps vous préoccupe parce que vous allez traiter plusieurs images, il peut être plus facile d'exécuter plusieurs processus et de faire en sorte que chaque processus traite un sous-ensemble distinct d'images.

+0

Le module multi-traitement/traitement prend en charge les processus multiples et l'IPC pour vous, et permet une meilleure mise à l'échelle que les threads Python traditionnels pour les tâches gourmandes en ressources CPU. – Jay

+0

Hmm, je ne le savais pas. Merci. –

+0

Je ne suis pas inquiet au sujet du temps autant que de la bonne pratique pour le multithread – helloandre

0

Les opérations de matrices en vrac comme l'opérateur Sobel vont certainement réaliser des gains de vitesse significatifs en utilisant (correctement) Matlab/Octave. Il est possible que NumPy puisse fournir des accélérations similaires pour les opérations matricielles/matricielles.

2

Je recommande également d'utiliser NumPy. Non seulement cela sera probablement plus rapide, mais si vous utilisez des threads avec, il n'y aura pas de verrou global.

Je suggère également d'utiliser le multiprocessing comme le suggère Jay.

De toute façon, si vous voulez vraiment pratiquer le threading, je vous suggère de jouer avec PThreads en C. Les PThreads sont incroyablement simples à utiliser pour les cas de base et utilisés partout.

0

Le mutliprocessing Python est le bon choix si vous voulez pratiquer la programmation parallèle avec Python. Si vous n'avez pas Python 2.6 (ce qui n'est pas le cas si vous utilisez Ubuntu par exemple), vous pouvez utiliser la version Google code backported du multitraitement. Il fait partie de PyPI, ce qui signifie que vous pouvez facilement l'installer en utilisant EasyInstall (qui fait partie du paquet python-setuptools dans Ubuntu).

Questions connexes