Синхронизирована ли печать Python? - PullRequest
3 голосов
/ 09 декабря 2010

Синхронизирована ли печать Python? :)

Между нитями.

Ответы [ 4 ]

11 голосов
/ 09 декабря 2010

Печать Python даже не обеспечивает многопоточности .(Слова Брэма Коэна, а не мои.)

2 голосов
/ 09 декабря 2010

если вы вызываете print из нескольких потоков, выходные данные могут чередоваться по желанию планировщика.

1 голос
/ 27 февраля 2015

Ответ - нет, потоки могут прерывать друг друга.Тем не менее, вы можете использовать блокировки, чтобы избежать этого.

Блокировки предотвращают прерывание потоков друг с другом в глобальных вещах (в частности, здесь, на экране вывода), когда поток хочет использовать глобальную вещь с блокировкой, сначала он проверяет,Блокировка разблокирована, если нет, она ждет, пока она не будет, после этого она блокирует блокировку, делает то, что хочет, с глобальной вещью, и, наконец, снимает блокировку.

Однако не просто используйтепомечать переменные и проверять, чтобы реализовать это, потоки могут переключаться между оператором if и блокировкой.Python реализует класс блокировки, если я правильно помню его threading.lock.

Также обратите внимание, что вы можете столкнуться с тупиковой или прямой блокировкой, если не используете блокировки правильно.У меня не так много времени, поэтому я не могу объяснить все это здесь, но вы можете в Google, чтобы узнать больше, я также проверю, смогу ли я поделиться презентациями с моего прошлогоднего курса в университете, они объясняют, что довольнотам хорошо.

0 голосов
/ 02 января 2019

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

Плюсы: не требует блокировки и, следовательно, быстрее.

Минусы:

  • Он не синхронизирован, и нет гарантии, что события будут напечатаны в том порядке, в котором они произошли. В качестве побочного эффекта, если появляется исключение, текст исключения может начинаться до того, как будут напечатаны последние несколько отпечатков. Они могут отображаться после текста исключения или где-то в середине трассировки стека.
  • Требуется немного больше времени и памяти для запуска цикла.
import threading, time


class SomeThread(threading.Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name
        ...

    def mono_print(self, *v):
        p = time.strftime("%Y-%m-%d %H:%M:%S") + ' ' + self.name
        for s in v:
            p += ' ' + str(s)
        print(p + '\n', end='', flush=True)

    def run(self):
        self.mono_print('thread is running.')

        ...

        self.mono_print('something', 'them something else')

        ...

        self.mono_print('processed')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...