J'utilise le module logging, et chaque message émis par un thread contient l'identifiant du thread.
Comme ça je vois qui fait quoi, qui envoie un message à qui, etc.
http://docs.python.org/lib/module-logging.html
(instancié dans le main):
...
handler.setFormatter(logging.Formatter('[%(thread)d] %(name)s: %(message)s'))
logging.getLogger().addHandler(handler)
...
Ensuite je l'utilise dans chaque classe dérivant de threading:
logging.getLogger(self.name).info(message)
(on pourrait aussi utiliser self.__class__ pour obtenir le nom de la classe)
Ce qui me donne des logs du genre:
[2448] collector_yahooimagesearch: http://www.pearl-of-wisdom.com/images/toy4.jpg
[3088] collector_flickr: Querying 'toy toys'
[2312] collector_googleimages: http://www.germes-online.com/direct/dbimage/50215787/Toy_Car.jpg
[2312] collector_googleimages: Querying 'toy toys'
[2232] collector_askjeevesimages: Stopped
[2700] collector_deviantart: list index out of range
Traceback (most recent call last):
File "webgobbler.py", line 1865, in run
File "webgobbler.py", line 2114, in _getRandomImage
File "C:\Python24\Lib\random.py", line 249, in choice
IndexError: list index out of range
[2700] collector_deviantart: Stopped
[2312] collector_googleimages: Stopped
[3088] collector_flickr: Stopped
[2448] collector_yahooimagesearch: Stopped
[2664] imagepool: Using images in C:\Program Files\webGobbler\imagepool
[2664] assembler_superpose: Starting from previous image.
[3796] assembler_superpose: Shutting down
[2688] imagepool: Shutting down
[2700] collector_deviantart: Shutting down.
[2312] collector_googleimages: Shutting down.
[2232] collector_askjeevesimages: Shutting down.
[2448] collector_yahooimagesearch: Shutting down.
[3088] collector_flickr: Shutting down.
Les numéros entre crochets sont les identifiants de thread.
“Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++