wielowątkowość: dlaczego generatory nie są bezpieczne dla wątków? Co się dzieje, gdy jest udostępniany między wątkami?
czytamto pytanie która pyta, czy generatory są bezpieczne dla wątków, a jedna odpowiedź mówi:
Nie jest bezpieczny dla wątków; jednoczesne połączenia mogą przeplatać się i mieszać z lokalnymi zmiennymi.
Kolejna odpowiedź pokazuje, że możesz użyć blokady, aby upewnić się, że tylko jeden wątek korzysta z generatora naraz.
Jestem nowy w wielowątkowości. Czy ktoś może wymyślić przykład pokazujący, co dokładnie dzieje się, gdy używasz generatora bez blokady?
Na przykład wydaje się, że nie ma żadnych problemów, jeśli to zrobię:
import threading
def generator():
for i in data:
yield i
class CountThread(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
for i in gen():
print '{0} {1}'.format(self.name, i)
data = [i for i in xrange(100)]
gen = generator()
a = CountThread('a')
b = CountThread('b')
a.start()
b.start()