Когда вы имели (упрощение к важной части)
def foo(text):
writeResults(line, result)
foo
, не имея локальной переменной line
, использовали переменную global с таким именем... который оказывается одним набором (в главном потоке) на for line in file:
.
В частности, я ожидаю, что общее количество записанных строк будет в порядке: в каждой строке по одному потоку (странная архитектура(BTW) и каждый поток записывает одну строку ... единственная проблема заключается в том, какая строка записывает каждый поток.
По вашему мнению, первый поток пишет первую строку, второй потокпишет вторую строку и т.д .;но на самом деле каждый поток напишет строку, связанную с глобальным именем line
в критический момент, когда поток вызывает writeResults
.Таким образом, некоторые строки могут в конечном итоге записываться несколько раз, другие - не записываться.
Например, предположим, что основной поток работает быстрее на столько, чтобы запустить все подпотоки до того, как какая-либо из них действительно приступит к записи.В этом случае значение last , принятое глобальным именем line
(т.е. последней строкой в файле), будет записано всеми потоками.
Обратите внимание, чтодаже в «исправленной» версии нет гарантии относительно порядка , в котором записываются различные строки, что является частью того, что делает эту архитектуру странной - обычно, поскольку строки располагаются в определенном порядке, выхотел бы сохранить этот порядок на выходе.Я полагаю, ваш случай приложения достаточно специфичен, чтобы не нуждаться в этом ограничении, но я все еще озадачен тем, что вам нужно столько потоков, когда вы читаете из одного файла и записываете в один файл! -)