2013-01-08 1 views
1

Je suis en train de profiler du code CPython multithread.
Afin de mesurer le temps qu'il faut pour exécuter un segment de code spécifique, je voudrais forcer le GIL (Global Interpreter Lock) à pas basculer entre threads pour ce segment. Comment cela peut-il être fait?Forcer le GIL à ne pas changer de threads

MISE À JOUR:
Assumer le pseudo-code suivant:

some_code_1() 
make_the_interpreter_not_change_thread() 
take_start_time() # time critical 
code_to_profile() # time critical 
take_end_time()  # time critical 
release_the_interpreter() 
some_code_2() 

Ma préoccupation est que l'interprète basculera fil pendant la période de profilage 'moment critique'.

Répondre

5

Le GIL ne change pas de filetage. Le GIL est un mutex qui empêche plusieurs threads d'exécuter le bytecode en même temps. En tant que tel, pour éviter le changement de fil, vous devez regarder ailleurs.

Vous pouvez appeler sys.setcheckinterval() avec une valeur vraiment importante pour empêcher la commutation pendant que votre code est en cours de profilage. Lorsque vous appelez sys.setcheckinterval(count), le «compteur» actuel est réinitialisé à la nouvelle valeur. Ainsi, dès que vous l'appelez, aucun commutateur de thread n'est autorisé pour au moins count instructions de bytecode.

+0

Voir ma mise à jour de la question. Souhaitez placer un grand nombre via 'sys.setcheckinterval()' dans 'make_the_interpreter_not_change_thread()' fonctionne? L'interpréteur change-t-il le nombre actuel d'instructions virtuelles python, ou la nouvelle valeur ne sera-t-elle affectée que lors du cycle suivant de la vérification de l'interpréteur, ce qui pourrait malheureusement se produire pendant 'code_to_profile()'? – Jonathan

+1

@Jonathan: La fonction réinitialise le nombre actuel lorsqu'il est appelé. Donc, l'appeler avec une grande valeur garantit qu'aucun commutateur de thread ne sera fait pour ce nombre d'instructions de bytecode. –

Questions connexes