Ich habe ein Problem, wo ich den Index eines Arrays an eine Funktion übergeben muss, die ich inline definieren. Die Funktion wird dann als Parameter an eine andere Funktion übergeben, die sie schließlich als Rückruf bezeichnet.Odd Threading-Verhalten in Python
Die Sache ist, wenn der Code aufgerufen wird, ist der Wert des Index alles falsch. Ich habe das schließlich gelöst, indem ich einen hässlichen Workaround erstellt habe, aber ich bin daran interessiert zu verstehen, was hier passiert. Ich habe ein minimales Beispiel, das Problem zu demonstrieren:
from __future__ import print_function
import threading
def works_as_expected():
for i in range(10):
run_in_thread(lambda: print('the number is: {}'.format(i)))
def not_as_expected():
for i in range(10):
run_later_in_thread(lambda: print('the number is: {}'.format(i)))
def run_in_thread(f):
threading.Thread(target=f).start()
threads_to_run_later = []
def run_later_in_thread(f):
threads_to_run_later.append(threading.Thread(target=f))
print('this works as expected:\n')
works_as_expected()
print('\nthis does not work as expected:\n')
not_as_expected()
for t in threads_to_run_later: t.start()
Hier ist die Ausgabe:
this works as expected:
the number is: 0
the number is: 1
the number is: 2
the number is: 3
the number is: 4
the number is: 6
the number is: 7
the number is: 7
the number is: 8
the number is: 9
this does not work as expected:
the number is: 9
the number is: 9
the number is: 9
the number is: 9
the number is: 9
the number is: 9
the number is: 9
the number is: 9
the number is: 9
the number is: 9
Kann jemand erklären, was hier geschieht? Ich nehme an, es hat damit zu tun, den Bereich oder etwas zu umschließen, aber eine Antwort mit einem Hinweis, der diese dunkle (für mich) Ecke des Python-Scopings erklärt, wäre für mich wertvoll.
Ich laufe dies auf Python 2.7.11
Ich empfehle, einen Debugger [pdb] starten (https://docs.python.org/2/library/pdb.html) wird ausreichen, entfernen Sie die Arbeit als erwartet Teil des Codes und nur Schritt für Schritt durch die Ausführung Es wird dir sehr schnell klar machen, was genau passiert. –
@TymoteuszPaul Ich glaube, du verstehst den Punkt meiner Frage falsch. Es ist nicht so, dass ich nicht verstehe, was der Code macht. Ich verstehe nicht, warum es so ist. Ich suche nach einer Antwort, die mir hilft zu verstehen, wie die * Sprache * tatsächlich funktioniert, damit ich besser über den Code nachdenken kann. Danke für die Anregung, ich mag pdb ziemlich. – Stephen