Потоки Python мешают, если выполняются слишком быстро

У меня есть несколько потоков, которые должны выполняться параллельно, как это часто делают потоки:D

Если я не замедляю их, они, как правило, марионуют друг друга, пишут друг другу пространство. Таким образом, когда я печатаю оператор, я вижу то, что в некоторых потоках выглядит как "эхо" (не термин кодирования, а буквальное эхо).

Когда я их замедляю, кукольства не происходит.

Вот пример того, что я получаю на терминале при запуске этих фиктивных учетных записей:

Meikitotokiku83: day_2, Wed Jun 10 03:32:53 2015, nine
Robinia6424: day_2, Wed Jun 10 03:32:53 2015, four
Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, fifteen
Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, thirteen
Mekushishifu643: day_7, Wed Jun 10 03:32:53 2015, two
Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, eleven
Meikitotokiku83: day_2, Wed Jun 10 03:32:53 2015, six
Mekushishifu643: day_2, Wed Jun 10 03:32:53 2015, three
**Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, ten 
Meikitotokiku83: day_7, Wed Jun 10 16:33:03 2015, ten 
 Meikitotokiku83: day_7, Wed Jun 10 16:33:03 2015, ten 
Meikitotokiku83: day_7, Wed Jun 10 16:33:03 2015, ten** 
Meikitotokiku83: day_2, Wed Jun 10 03:32:53 2015, fourteen
Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, sixteen
DaDaFurstig6304: day_7, Wed Jun 10 03:32:53 2015, five
DoraDiggle5529: day_7, Wed Jun 10 03:32:53 2015, one
Meikitotokiku83: day_2, Wed Jun 10 03:32:53 2015, seven

Обратите внимание на эхо, которое появляется в тех, которые помечены "десять".

Мне бы очень хотелось, чтобы мне не нужно было публиковать свой код, потому что большинство программистов на python, вероятно, поймут, в чем я не нахожусь в этой проблеме многопоточности, без моих 300-строчных классов, размещенных здесь.

Классы довольно большие, поэтому я не буду публиковать их здесь. Я подозреваю, что это общая проблема, которую я просто не распознаю, например, проблема с процессором?

Какова частая причина этого, и как это можно обойти без использования временных задержек?

2 ответа

Решение

Получают ли эти потоки доступ к общим данным, то есть к одной и той же переменной или переменным? Если это так, и если данные не защищены с помощью блокировок / синхронизации, то они подвержены условиям состязания потоков. Это верно в любой параллельной среде программирования, а не только в Python. Посмотрите этот хороший обзор синхронизации Python.

Это стандартное поведение потока. Не используйте потоки с общим выходом. Потоки Python являются атомарными: это означает, что если вы предоставите им изолированную среду, они не доставят вам проблем. Если у вас есть доступ к динамическим изменениям общих данных или запись в общий объект или буфер, то у вас возникнут такие проблемы.

Проблема в том, что вы неправильно используете поток. Записывайте в отдельный буфер внутри каждого потока, и когда потоки будут готовы, объедините результаты.

Другие вопросы по тегам